首页 > 编程语言 >.Net【基础回顾】并行编程Parallel

.Net【基础回顾】并行编程Parallel

时间:2022-11-29 22:23:21浏览次数:42  
标签:Console 编程 watch bag WriteLine ElapsedMilliseconds Net Parallel

Parallel三种用法

  • Parallel.Invoke

  • Parallel.for

  • Parallel.forEach

  1. Parallel.Invoke
class Program
{
    static void Main(string[] args)
    {
        var watch = Stopwatch.StartNew();

        watch.Start();

        Run1();

        Run2();

        Console.WriteLine("我是串行开发,总共耗时:{0}\n", watch.ElapsedMilliseconds);

        watch.Restart();

        Parallel.Invoke(Run1, Run2);

        watch.Stop();

        Console.WriteLine("我是并行开发,总共耗时:{0}", watch.ElapsedMilliseconds);

        Console.Read();
    }

    static void Run1()
    {
        Console.WriteLine("我是任务一,我跑了3s");
        Thread.Sleep(3000);
    }

    static void Run2()
    {
        Console.WriteLine("我是任务二,我跑了5s");
        Thread.Sleep(5000);
    }
}
 

Parallel.for

class Program
{
    static void Main(string[] args)
    {
        for (int j = 1; j < 4; j++)
        {
            Console.WriteLine("\n第{0}次比较", j);

            ConcurrentBag<int> bag = new ConcurrentBag<int>();

            var watch = Stopwatch.StartNew();

            watch.Start();

            for (int i = 0; i < 20000000; i++)
            {
                bag.Add(i);
            }

            Console.WriteLine("串行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds);

            GC.Collect();

            bag = new ConcurrentBag<int>();

            watch = Stopwatch.StartNew();

            watch.Start();

            Parallel.For(0, 20000000, i =>
            {
                bag.Add(i);
            });

            Console.WriteLine("并行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds);

            GC.Collect();

        }
    }
}

Parallel.forEach

class Program
{
    static void Main(string[] args)
    {
        for (int j = 1; j < 4; j++)
        {
            Console.WriteLine("\n第{0}次比较", j);

            ConcurrentBag<int> bag = new ConcurrentBag<int>();

            var watch = Stopwatch.StartNew();

            watch.Start();

            for (int i = 0; i < 3000000; i++)
            {
                bag.Add(i);
            }

            Console.WriteLine("串行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds);

            GC.Collect();

            bag = new ConcurrentBag<int>();

            watch = Stopwatch.StartNew();

            watch.Start();

            Parallel.ForEach(Partitioner.Create(0, 3000000), i =>
            {
                for (int m = i.Item1; m < i.Item2; m++)
                {
                    bag.Add(m);
                }
            });

            Console.WriteLine("并行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds);

            GC.Collect();

        }
    }
}

设置最大并行数


var cancellationTokenSouce = new CancellationTOkenSource();
ParallelOptions options = new ParallelOptions();
options.MaxDegressOfParallelism = 2; //设置最大并行数,并行的任务有几个
options.CancellationToken = cancellationTokenSouce.token;

Paraller.For(0,100,options,(i,loopstate)=>{
    if(i==100){
        loopstate.Stop();
    }
});

标签:Console,编程,watch,bag,WriteLine,ElapsedMilliseconds,Net,Parallel
From: https://www.cnblogs.com/thomerson/p/16936903.html

相关文章

  • 网易编程题2018
    小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。......
  • 在ARM处理器的Linux系统上安装 .NET SDK(Core 3.1~7.0),并检测ARM内在函数的支持情况
    作者:目录一、尝试apt-get安装二、尝试snap安装三、使用dotnet-install脚本安装3.1脚本准备3.2安装最新长期支持(LTS)版.NET6.03.3安装最新版本.NE......
  • .NET6之MiniAPI(二十四):用Polly重试
    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效访......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非......
  • .NET6之MiniAPI(二十四):用Polly重试
    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效......
  • .NET6之MiniAPI(二十四):用Polly重试
    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目......
  • .NET6之MiniAPI(二十三):Refit
    本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢?它是一个让我们调用API......
  • .NET6之MiniAPI(二十三):Refit
    本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢?它是一个让我们调用API就......
  • .NET6之MiniAPI(二十二):HttpClient
    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.netcoreminiapi框架下,HttpClient的引入和使用方式。我们在业务开发中,免不了调用三方的服务,这时就会用到Htt......