C# Parallel.Invoke的使用方法

本文主要介绍C#中Parallel.Invoke相关介绍,及使用方法示例代码。

    在Parallel并行类下面有三个常用的方法Invoke,for和forEach,这篇文章介绍Invoke的使用,Parallel.Invoke在官网定义是:尽可能并行执行提供的每个操作。也就是给定任务在有限的资源条件下实行并行执行。有两个重载Invoke(Action[])和Invoke(ParallelOptions, Action[])。.
    Invoke(Action[])方法是最基本的方法,就如它定义的那样“尽可能并行执行提供的每个操作”。
    Invoke(ParallelOptions, Action[])执行所提供的每个操作,而且尽可能并行运行,除非用户取消了操作。
使用案例

    此示例展示用重载一的 Invoke并行使用静态方法、匿名委托和 lambda 表达式 。

static void Main(){    try    {        Parallel.Invoke(            BasicAction,  // 参数 #0 -静态方法            () =>      // 参数#1 - lambda表达式            {                Console.WriteLine("Method=beta, Thread={0}", Thread.CurrentThread.ManagedThreadId);            },            delegate()    // 参数#2 - delegate委托            {                Console.WriteLine("Method=gamma, Thread={0}", Thread.CurrentThread.ManagedThreadId);            }        );    }    //本例中不应出现异常,如果有异常会抛出当前异常的参数方法,而不影响其他参数。    //它将被包装在AggregateException中并传播到主线程。    catch (AggregateException e)    {        Console.WriteLine("An action has thrown an exception. THIS WAS UNEXPECTED.\n{0}", e.InnerException.ToString());    }}static void BasicAction(){    Console.WriteLine("Method=alpha, Thread={0}", Thread.CurrentThread.ManagedThreadId);}

我们来看看运行结果:

C# Parallel.Invoke的使用方法

从结果线程ID来看是运行了3个线程,三个参数的方法不是安装顺序执行。此方法运行后主线程必须等待它运行完成才执行下一步认为,如果Invoke参数中的方法执行时间相差太大就会出现时间参差不齐,影响效率,这时就没有必要使用Invoke了。如果有异常会抛出当前异常的参数方法,而不影响其他线程。

我们在看看重载2的使用

readonly static CancellationTokenSource _cts = new CancellationTokenSource();//这个需要设置局部变量static void Main(){    var po = new ParallelOptions//第一个参数可以设置线程的特性     {       CancellationToken = _cts.Token, // 控制线程取消        MaxDegreeOfParallelism = 2  // 设置最大的线程数3,仔细观察线程ID变化    };     try{            Parallel.Invoke(po,BasicAction, () => BasicAction(po,""),BasicAction3);    }      catch (AggregateException e){       Console.WriteLine(e.Message);     }
}//如果有参数需要按匿名方法二形式写,如() => BasicAction(po,"")static void BasicAction()//方法1{    Console.WriteLine("Method=alpha1, Thread={0}", Thread.CurrentThread.ManagedThreadId);}static void BasicAction(ParallelOptions po,string task)//方法2{    Console.WriteLine("Method=alpha2, Thread={0}", Thread.CurrentThread.ManagedThreadId);      // 判断是否已经取消      for(int i=0;i<100;i++)      {        if (po.CancellationToken.IsCancellationRequested)        {               Console.WriteLine("已经被取消。");                return;        }        Thread.Sleep(100);      }}static void BasicAction3()//方法3{    Console.WriteLine("Method=alpha3, Thread={0}", Thread.CurrentThread.ManagedThreadId);       Thread.Sleep(10000 * 10);        //取消线程        _cts.Cancel();        Console.WriteLine("取消成功");}

重载2主要增加了一个配置参数,从这个参数可以配置最大线程数,线程取消等。

时间关系,今天就分享到这。欢迎留言讨论。