.Net中可用的并行技术

Yin*_*Zhu 11 .net c# parallel-processing f#

我是.Net平台的新手.我做了一个搜索,发现有几种方法可以在.Net中进行并行计算:

  1. 任务并行库中的并行任务,即.Net 3.5.

  2. PLINQ,.Net 4.0

  3. Asynchounous Programming,.Net 2.0,(异步主要用于执行I/O繁重的任务,F#有一个简洁的语法支持这一点).我列出这个是因为在Mono中,似乎没有TPL或PLINQ.因此,如果我需要编写跨平台并行程序,我可以使用异步.

  4. .Net线程.没有版本限制.

您能否对这些做一些简短评论或在此列表中添加更多方法?

Ste*_*ary 15

您需要做大量的研究才能确定如何有效地进行多线程.有一些很好的技术文章,是Microsoft Parallel Computing团队网站的一部分.

在我的脑海中,有几种方法可以解决多线程问题:

  1. Thread 类.
  2. ThreadPool,它还支持I/O绑定操作和I/O完成端口.
  3. Begin*/ End*异步操作.
  4. 使用基于事件的异步编程(或"EBAP")组件SynchronizationContext.
  5. BackgroundWorker,这是一个定义异步操作的EBAP.
  6. Task .NET 4中的类(任务并行库).
  7. 并行LINQ.有一个很好的文章上Parallel.ForEach(任务并行库)与PLINQ.
  8. Rx或"LINQ to Events",它还没有非Beta版本,但接近完成并且看起来很有希望.
  9. (仅限F#)异步工作流程.

更新:有一篇文章了解和应用.NET Framework 4的并行模式可供下载,它为哪些解决方案用于哪种并行方案提供了一些指导(尽管它假定为.NET 4并且不包括Rx).


Mau*_*fer 12

严格来说,应该在这里区分并行,异步和并发.

并行意味着"任务"被分成几个可以同时运行的较小子任务.这需要一个多核CPU或多CPU计算机,其中每个任务都有其专用的核心或CPU.或多台电脑.PLINQ(数据并行)和TPL(任务并行)属于这一类.

异步意味着任务在不相互阻塞的情况下运行.F#的异步表达式,Rx,Begin/End模式都是异步编程的API.

并发是一个比并行化和异步更广泛的概念.并发意味着几个"任务"同时运行,彼此交互.但是这些"任务"不必在单独的物理计算单元上运行,就像在并行化中那样.例如,多任务操作系统甚至可以使用时间片在单核单CPU计算机上同时执行多个进程.并发可以通过例如Actor模型和消息传递来实现(例如F#的邮箱,Erlang进程(在.Net中的Retlang))

与上述概念相比,线程是一个相对低级的概念.线程是在进程内运行的任务,并行运行并由操作系统的调度程序直接管理.当操作系统通过在每个线程上实现消息队列,路由等将每个线程映射到单独的核心或Actor模型时,可以实现并行化.