本文主要介绍C#中Parallel.Invoke相关介绍,及使用方法示例代码。
此示例展示用重载一的 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 交流学习群 长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。