码迷,mamicode.com
首页 > 其他好文 > 详细

Parallel Programming-Parallel.Invoke

时间:2015-11-06 01:36:02      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

本文主要介绍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)
            );
        }

 

Parallel Programming-Parallel.Invoke

标签:

原文地址:http://www.cnblogs.com/kmpp/p/Parallel_Programming_Parallel_Invoke.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!