41

我有一个在 .NET 4.0 和 VS2010 中使用 C# 的 .NET 项目。

我想做的是向我的库中添加一些异步重载,以便使用 await 关键字在 .NET 4.5 中的用户更轻松地进行异步编程。现在重载的方法是非异步的。此外,我不想自己使用任何异步方法,只需创建新方法并使其可用。

是否可以在 .NET 4.0 和 VS2010 中创建异步方法,如果可以,.NET 4.0 异步方法应该是什么样的?

因为我使用的是 VS2010,所以我无法访问“async”关键字,那么在 .NET 4.0 中模拟该行为需要做什么?例如,它是否需要返回任何特定类型,是否需要在方法内部发生任何代码以使其正在调用的当前非异步代码异步发生?

4

3 回答 3

32

正如其他人所说,您首先要使用方法 return Taskor Task<TResult>。这足以await在 .NET 4.5 中产生结果。

要使您的方法尽可能适合未来的异步代码,请遵循基于任务的异步模式文档(也可在 MSDN 上获得)中的指南。它提供命名约定和参数建议,例如,用于支持取消。

对于您的方法的实现,您有几个选择:

于 2012-03-06T00:01:41.850 回答
9

最简单的方法是返回 aTask或 a Task<T>。那就足够了。

但是,这只有在您的方法真正异步执行时才有意义。

我还建议您按照通常的模式命名它们,例如 AbcAsync(“Async”后缀)。您的调用者不会注意到与使用 C# 5 创建的异步方法有任何区别(因为没有)。

提示:只需将 async 添加到该方法中就不会执行任何操作。您的方法将按顺序执行并返回已完成的任务。使方法返回任务必须服务于特定目的——通常这样做是因为该方法固有地异步执行(如 Web 服务调用或文件 IO)。

如果您的方法仅包含计算但没有 IO(或仅阻塞 IO),则通常最好不要使其异步,因为这样做一无所获。异步方法并不总是在单独的线程上执行。如果最后一句话让您感到惊讶,您可能想深入研究一下这个话题。

于 2012-03-05T22:12:26.457 回答
3

只要您返回一个以某种方式完成的任务(无论是在线程中还是异步),您就会支持异步模型..

让任务异步执行是另一回事。如果您有权访问 async 关键字和 API,您可以简单地将您的方法基于对其他已提供的异步方法的异步调用。但在这种情况下,您必须手工制作异步任务。

可能有更好的方法来做到这一点,但我能看到(并且已经使用过)的最优雅的方法是利用System.Threading.Tasks.TaskCompletionSource构建任务,使用异步方法的Begin/End模型来执行您需要执行的任何内容。然后,当您手头有结果时,Task使用您的完成源将其发布到先前构造的实例。

它肯定是异步的,只是不像即将发布的版本那样花哨。

免责声明:我远不是这方面的专家。刚刚做了一些实验。

于 2012-03-05T23:07:13.453 回答