我在一些程序中使用了多个线程,但仍然不太熟悉它。
C#/.NET有哪些多线程库?它们之间有什么优劣势?
通过多线程库,我指的是一切可以帮助简化多线程编程的工具。
在.NET集成中,你定期使用哪些(例如线程池)?遇到了哪些问题?
我在一些程序中使用了多个线程,但仍然不太熟悉它。
C#/.NET有哪些多线程库?它们之间有什么优劣势?
通过多线程库,我指的是一切可以帮助简化多线程编程的工具。
在.NET集成中,你定期使用哪些(例如线程池)?遇到了哪些问题?
使用多线程的应用有各种原因:
选择何种方法取决于你试图做什么。例如,考虑使用 BackgroundWorker
来实现UI响应性。
对于并发操作(例如服务器:即使在单核系统上也可能需要并发,但不一定要并行),可以考虑使用线程池或者如果任务是长期存在且你需要大量的任务,可以考虑每个任务使用一个线程。
如果有所谓的“尴尬的”可轻松将问题分成小子问题的问题,请考虑使用工作线程池(与CPU内核数量相同的许多线程从队列中提取任务)。 Microsoft 的任务并行库(TPL) 可以帮助您解决这个问题。如果该工作可以轻松地表示为Monad流计算(即在LINQ查询中具有转换和聚合工作等),则运行在TPL之上的Parallel LINQ(相同链接)可能有所帮助。
还有其他方法,例如Erlang中看到的Actor-style parallelism,由于.NET缺乏绿色线程模型或者实现同样的CLR支持的连续性,这些方法在.NET上实现难度较大。
请查看Power Threading库。
我的建议是在转向其他库之前,先熟悉线程池。许多框架代码都使用线程池,因此即使您找到了最好的线程库,仍然需要使用线程池,因此您真的需要理解它。
您还应该记住,已经投入了大量工作来实现和调整线程池。 .NET 的即将推出的版本有许多改进,这些改进是由并行库的开发触发的。
在我看来,许多当前线程池的“问题”可以通过了解其优点和缺点来解决。
您不必显式使用线程池,如果需要异步调用,可以使用BeginInvoke-EndInvoke。它在幕后使用线程池。请参见此处:http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx
http://devpinoy.org/blogs/jakelite/archive/tags/Threading+Patterns/default.aspx
对我来说,框架内置的类已经足够了。虽然Threadpool
有点奇怪和无聊,但你可以很容易地编写自己的线程池。
我经常在前端使用BackgroundWorker
类,因为它使生活变得更加轻松 - 调用事件处理程序时会自动完成。
我经常手动启动线程,并使用ManualResetEvent
将其保存在字典中,以便能够检查哪些线程已经结束。我使用WaitHandle.WaitAll()
方法来实现这一点。问题在于,WaitHandle.WaitAll一次不接受超过64个WaitHandles的数组。