.Net【基礎回顧】並行程式設計Parallel
阿新 • • 發佈:2022-11-30
Parallel
三種用法
-
Parallel.Invoke
-
Parallel.for
-
Parallel.forEach
- 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();
}
});