在.NET 4.0中创build一个可以与.NET 4.5中的“await”一起使用的asynchronous方法

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

我想要做的是添加一些asynchronous重载到我的库,以使用.NET Framework 4.5中的用户使用await关键字更轻松地进行asynchronous编程。 现在被重载的方法是非asynchronous的。 另外我不想自己使用任何asynchronous方法,只是创build新的并使其可用。

在.NET 4.0和VS2010中创buildasynchronous方法是可能的,如果是这样,.NET 4.0asynchronous方法应该是什么样子?

因为我正在使用VS2010,所以我无法访问“async”关键字,因此需要在.NET 4.0中模拟这种行为。 例如,它是否需要返回任何特定的types,并且是否需要在该方法内部发生任何代码,以使它正在调用的当前非asynchronous代码asynchronous发生?

正如其他人所说,你开始有一个方法返回TaskTask<TResult> 。 这足以在.NET 4.5中await它的结果。

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

为了实现你的方法,你有几个select:

  • 如果您有现有的基于IAsyncResult的asynchronous方法,请使用Task.Factory.FromAsync
  • 如果您有另一个asynchronous系统,请使用TaskCompletionSource<TResult>

最简单的方法是返回TaskTask<T> 。 这就够了。

然而这只有在你的方法真的asynchronous执行时才有意义。

我也build议你遵循像AbcAsync(“Async”后缀)这样的命名方式。 你的调用者不会注意到用C#5创build的asynchronous方法(因为没有)。

提示:只需向该方法添加asynchronous就什么都不做。 您的方法将按顺序执行并返回已完成的任务。 使方法返回一个任务必须达到一定的目的 – 通常这是因为该方法固有地asynchronous执行(如Web服务调用或文件IO)。

如果你的方法只包含计算,但不包含IO(或只阻塞IO),通常最好不要使其成为asynchronous,因为你没有做任何事情。 asynchronous方法并不总是在单独的线程上执行。 如果最后一句话让你感到吃惊,你可能会想深入一些。

只要你返回一个以某种方式完成的任务(无论是线程还是asynchronous),你都可以支持asynchronous模式。

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

可能有更好的办法,但是我能看到(并且已经使用)的最优雅的方式是利用System.Threading.Tasks.TaskCompletionSource来构造一个任务,使用asynchronous方法的Begin / End模型来执行你需要的任何东西执行。 然后,当您手头上有结果时,使用您的完成源将其发布到之前构build的Task实例。

它肯定会是asynchronous的,只是不像即将发布的版本。

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