1. 程式人生 > 其它 >.Net【基礎回顧】並行程式設計Parallel

.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();
    }
});