C# 在库中使用多线程有哪些策略?

C# 在库中使用多线程有哪些策略?,c#,.net,multithreading,C#,.net,Multithreading,我正在编写一个库来处理长期运行的任务,比如文件下载和处理大量文本。我想多线程处理这个库,这样这些任务就不会冻结使用它们的应用程序 你有没有什么建议可以让我以结构化的方式这样做,或者我应该使用/避免的特定课程?我正在考虑使用IAsyncResult接口:,或者一些后台工作人员 这样这些任务就不会冻结使用它们的应用程序 如果这是您的目标,那么您应该研究框架中的标准异步编程模式 如果您的库的目标是.NET 4,请让它返回Task和Task,因为这将简化到C#和VB.NET下一版本中的异步支持的过渡。这

我正在编写一个库来处理长期运行的任务,比如文件下载和处理大量文本。我想多线程处理这个库,这样这些任务就不会冻结使用它们的应用程序

你有没有什么建议可以让我以结构化的方式这样做,或者我应该使用/避免的特定课程?我正在考虑使用
IAsyncResult
接口:,或者一些后台工作人员

这样这些任务就不会冻结使用它们的应用程序

如果这是您的目标,那么您应该研究框架中的标准异步编程模式

如果您的库的目标是.NET 4,请让它返回
Task
Task
,因为这将简化到C#和VB.NET下一版本中的异步支持的过渡。这还增加了一个非常好的功能,即允许同步使用,而无需您做额外的工作,因为用户可以随时执行以下操作:

var result = foo.BarAsync().Result; // Getting Task<T>.Result blocks, effectively making this synchronous
var result=foo.BarAsync().result;//获取Task.Result块,有效地使其同步

如果你的目标是.NET 3.5或更早,你应该考虑使用它,因为它在当前API中使用的比APM多。

我个人认为,这些决定应该留给你的库的用户。记录它可能会阻塞很长时间,并建议使用BackgroundWorker,但由他们决定。@Zan Lynx:好主意。但是,您是否建议公开每个长时间运行的方法的
sync
版本和
async
版本?也许是通过重写?@Zan:有时候,我同意-但是,在很多情况下,提供一个异步API有一些巨大的优势,因为你(作为库设计者)可以更有效地优化东西,如果你事先知道东西将被异步使用。此外,这向API的用户展示了它可以而且应该以异步方式使用。这是一个很好的例子,顺便说一句,文件下载可以而且应该在内部异步-没有真正的理由序列化该过程…非常好的地方。这就是你所指的:?@SimpleCoder:是的。这是从.NET4开始的异步开发的首选机制。该语言将在vNext中直接利用这一点,因此您可以使异步代码看起来几乎同步。非常感谢您的建议。