本文主要介绍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) ); }
新闻热点
疑难解答