C# 并行编程 Parallel

C# 并行编程

传统的同步代码执行的模式是等待上一个任务执行完了,然后再执行下一个任务,这样的缺点是速度慢

比如在以下代码中,有一个长度为10的List和一个处理程序,处理程序会处理List中的每一个项,处理速度是5s/个,那么执行完所有项需要50s

List<int> numList = new List<int>();
for(int i = 1; i <= 10; i++)
{
  numList.Add(i);
}
foreach(int item in numList)
{
  Console.WriteLine($"Begin {item}th task...");
  Thread.Sleep(5000);
  Console.WriteLine($"Stop {item}th task...");
}

如何提高任务处理的速度呢?一个简单的思路就是并行执行,把10个任务交给10个工人处理,假设一个工人处理一个任务需要5s,那么10个工人处理10个任务也只需要5s

List<int> numList = new List<int>();
for(int i = 1; i <= 10; i++)
{
  numList.Add(i);
}

//foreach(int item in numList)
//{
//  Console.WriteLine($"Begin {item}th task...");
//  Thread.Sleep(5000);
//  Console.WriteLine($"Stop {item}th task...");
//}

Parallel.ForEach(numList, (item, state) =>
{
  Console.WriteLine($"Begin {item}th task...");
  Thread.Sleep(5000);
  Console.WriteLine($"Stop {item}th task...");
});

除了Parallel.ForEach方法,Parallel还具有其它方法也可以实现并行编程

For

Parallel.For(1, 11, (item, state) =>
{
  Console.WriteLine($"Begin {item}th task...");
  Thread.Sleep(5000);
  Console.WriteLine($"Stop {item}th task...");
});

Invoke

Parallel.Invoke(() =>
{
  Console.WriteLine("Begin 1th task...");
  Thread.Sleep(5000);
  Console.WriteLine("Stop 1th task...");
},
() =>
{
  Console.WriteLine("Begin 2th task...");
  Thread.Sleep(5000);
  Console.WriteLine("Stop 2th task...");
});

并行计算

假设有一个复杂的计算可以分步进行,并且计算结果与计算顺序无关(例如累加或累乘),那么我们可以采用并行的方式来提高计算效率

为了方便演示,这里采用了一个简单的并行累加demo程序
假设我们需要使用程序来求1到100的和,并且假设一次加法需要消耗500ms时间,那么我们可以采用以下代码来进行并行编程

int sum = 0;
var result = Parallel.For(
  fromInclusive: 1,
  toExclusive: 101,
  /*parallelOptions: new ParallelOptions() {
    MaxDegreeOfParallelism = 100 //最大并发数
  },*/
  localInit: () => 0,
  body: (item, state, localSum) =>
  {
    Console.WriteLine($"Begin {item}th task...");
    Thread.Sleep(500);
    localSum += item;
    Console.WriteLine($"Stop {item}th task...");
    return localSum;
  },
  localFinally: (localSum) => Interlocked.Add(ref sum, localSum)
);
Console.WriteLine(sum);

实际上For、ForEach、Invoke还提供了很多重载方法
与之相关的类也有不少,都在System.Threading.Tasks命名空间下
更多内容可查阅官网

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值