.net多线程

时间:2010-10-26 10:37:06

标签: .net multithreading

我正在编写dll,它必须使用不同的参数多次运行一个函数,与其他所有参数并行。

我尝试过以下方法:

  • Backgroundworkers
  • MethodInvoker
  • 线程

最好的方法是什么?

更新

我正在写一个dll,没有涉及GUI

3 个答案:

答案 0 :(得分:2)

如果您使用的是.NET 4.0,则应使用新的Parallel Task Library

如果没有,请考虑使用线程池来处理ThreadPool.QueueUserWorkItem()。如果做不到这一点,那么创建一个新的Thread对象就是最佳选择。 为此使用BackgroundWorker;只有当您尝试将长时间运行的处理器密集型代码与阻止UI分离时,才会使用BackgroundWorker

有一个很好的例子,等待所有用户工作项在这里完成:http://msdn.microsoft.com/en-us/library/z6w25xa6.aspx。实际上,当异步代码完成时,您将ManualResetEvent对象传递给Set()的每个调用。您将所有ManualResetEvent个对象放入一个数组中,并调用WaitHandle.WaitAll()传入该数组以等待所有等待句柄的设置。

另一种技术可能是让一定数量的Thread个对象在等待项目出现在Queue中。这是一个相当标准的生产者/消费者模式,这意味着您需要更少的线程(因此也需要资源),但仍然可以通过将消息放入队列来将请求与工作分离。如果你需要队列是持久的,你可以使用MSMQ(你甚至可以使用ESB)。

正如您所看到的, 您正在考虑使用多线程对 实现它的方式产生巨大影响。 Windows窗体多线程与Windows服务的多线程不同,反过来也不会像在ASP.NET Web应用程序中那样(由于IIS中的资源管理,可以说线程甚至不是一个好主意)。如果您更新问题,我们可以更加具体地满足您当前的需求。

答案 1 :(得分:1)

线程很棘手 - “最佳”取决于非常具体的场景。例如,在Web服务器上,“最佳”可能不是在所有中使用线程,而是让其他线程处理其他请求。你应该避免的一件事是使ThreadPool饱和,因为系统的其他核心部分依赖于此。

声音就像一个多读者工作人员队列可以满足您的需要;另请注意,.NET 4.0引入了一系列控件(围绕“并行”和“任务”),使线程代码更易于处理。 合理的概述为here

答案 2 :(得分:0)

我的建议:

  • 如果要从WinForms UI启动后台线程,请使用BackgroundWorker组件。
  • 如果您在作业开始或完成时并不特别在意,只要它运行,请使用异步委托或线程池。
  • 否则,请手动创建新线程。