首页 > 学院 > 开发设计 > 正文

ParallelProgramming-Parallel.Invoke

2019-11-14 13:49:26
字体:
来源:转载
供稿:网友

本文主要介绍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是最简单的并行编程模型,用于并行执行多个互不相干的方法。有几点需要注意

  1. 只有当所有的Action执行完成后Invoke才会返回(WaitAll)
  2. 在执行过程中有其中一个Action发生异常,Invoke不会马上抛出异常,而是等所有的Action完成以后再次抛出异常

四、one more thing

4.1 MaxDegreeOfParallelism

Parallel.Invoke可以通过指定ParallelOption指定最大并行数量。

    public void ParallelAction()        {            Parallel.Invoke            (                new ParallelOptions()                {                    MaxDegreeOfParallelism = 1,                },                () => Action1(),                () => Action2()            );        }

上面的代码设置成了1,其实就是串行执行了。

执行时间如下。

 

 

4.2 CancellationSourceToken

同样可以通过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)            );        }

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表