讨论:.NET中的线程化

时间:2010-11-24 11:16:42

标签: c# multithreading

我想和你讨论.NET中的线程“事物”。 虽然其他语言/框架提供了有限的明确定义为什么如何处理异步调用,但在.NET中有无数种方法可以做到这一点。 我打算在这里做的是尝试定义一种“给定案例的最佳实践”。换句话说:你什么时候使用哪种踩踏方式?

让我们先详细说明如何使代码运行异步:

  • 主题(新主题)
  • ThreadPool(ThreadPool.QueueUserWorkItem)
  • BackgroundWorker(BackgroundWorker.RunWorkerAsync)
  • 委托(Delegate.BeginInvoke)
  • 任务Parallels Library
  • 并行类(Parallel.ForEach)


[我忘记了吗?]

以下是我决定使用何种类型的方法:
线程 - 通常当我需要对线程进行完全控制时,例如服务的主线。
ThreadPool - 没有高优先级的短任务 - 假设我们有一个连接到UI的IPC,我只需要放弃那些不阻止UI的调用 BackgroundWorker - UI项目 - >加载/启动画面
委托 - 仅当我需要与我的UI线程(Dispatcher / Form .Invoke)同步时才使用 任务Parallels Library - 尚未使用,我猜它是用于同步UI的“委托方式”的绝佳替代品 Parallel - 如果我需要为多个对象执行一些代码 - 例如收集来自不同服务器的邮件,我需要对每个邮件做一些事情。

现在它就在你身上,你如何决定在什么时候使用?

如果讨论进展顺利,我想添加Semaphore主题。

1 个答案:

答案 0 :(得分:2)

这是我的两分钱:

线程:当你感觉足够舒服时,你可以处理所有IDEAL线程数。这几乎总是如此。听到人们会说我想要真正的线程而不是.NET线程池。如果您不想问这个问题:Optimal number of threads per core不要使用线程。

ThreadPool :这是针对最佳线程数的盒子解决方案中的.net答案。然而,API并不是最好的。对于新项目,请使用TPL。

BackgroundWorker :如果您想通过简单的回发方式从GUI应用程序开始线程化。这提供了最简单的API。

Dispatcher :就像你说的那样。只是为了回调GUI线程。这对此至关重要。如果没有一些我不知道的模糊代码,没有其他方法可以使用它。
注意:它不叫代表。委托是您传递给Dispatcher以进行分派的内容。

任务并行库:这附带.net 4.建议您将它用于新项目。

并行:不,你错了。 Parallel.For在整个循环完成之前不会返回控制。当你想要做的就是并行执行一个循环时,它就是为了方便。非常适合将输入映射到输出,例如x - > X * 2。使用Parallel.For(或ForEach),您可以在多个线程上运行它(同样数量由.NET决定)以更快地运行循环。查看:http://www.lovethedot.net/2009/02/parallelfor-deeper-dive-parallel.html