本文主要介紹Parallel.Invoke的使用。
class ParallelInvoke { public void Action1() { Thread.Sleep(3000); Console.WriteLine("in action1"); } public void Action2() { Thread.Sleep(3000); Console.WriteLine("in action2"); } public void ParallelAction() { Parallel.Invoke(() => Action1(), () => Action2()); } }
class PRogram { static void Main(string[] args) { var stopwatch = Stopwatch.StartNew(); stopwatch.Start(); new ParallelInvoke().ParallelAction(); Console.WriteLine(stopwatch.ElapsedMilliseconds); Console.Read(); } }
上面的action1和action2如果并行執行至少需要3000*2毫秒,但是使用Invoke,內部并行執行,時間減半。
Parallel.Invoke是最簡單的并行編程模型,用于并行執行多個互不相干的方法。有幾點需要注意
Parallel.Invoke可以通過指定ParallelOption指定最大并行數量。
public void ParallelAction() { Parallel.Invoke ( new ParallelOptions() { MaxDegreeOfParallelism = 1, }, () => Action1(), () => Action2() ); }
上面的代碼設置成了1,其實就是串行執行了。
執行時間如下。
同樣可以通過ParallelOption指定CancellationSourceToken,多個并行任務之間可以協調取消
class ParallelInvoke { public void Action1(CancellationTokenSource cts) { cts.Cancel(); Thread.Sleep(3000); Console.WriteLine("in action1"); } public void Action2(CancellationTokenSource cts) { if (cts.IsCancellationRequested) { return; } Thread.Sleep(3000); Console.WriteLine("in action2"); } public void ParallelAction() { CancellationTokenSource cts = new CancellationTokenSource(); Parallel.Invoke ( new ParallelOptions() { CancellationToken = cts.Token, }, () => Action1(cts), () => Action2(cts) ); }
新聞熱點
疑難解答