我正在编写dll,它必须使用不同的参数多次运行一个函数,与其他所有参数并行。
我尝试过以下方法:
最好的方法是什么?
更新:
我正在写一个dll,没有涉及GUI
答案 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)
我的建议: