首页 文章详情

C#Parallel.Invoke的使用方法

DotNet NB | 275 2022-06-24 14:25 0 0 0
UniSMS (合一短信)

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

我们来看看运行结果:

从结果线程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主要增加了一个配置参数,从这个参数可以配置最大线程数,线程取消等。


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


参考:https://docs.microsoft.com/zh-cn/dotnet/


推荐阅读:
  API 工程化分享
  我的微软 MVP 之路
【译】ASP.NET Core 6 中的性能改进
【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
【译】C# 11 特性的早期预览

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2021开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter