C# 在.NET 4.0中创建可与“;等待“;在.NET4.5中

C# 在.NET 4.0中创建可与“;等待“;在.NET4.5中,c#,.net,async-await,.net-4.5,C#,.net,Async Await,.net 4.5,我有一个.NET项目,它使用.NET4.0和VS2010中的C# 我想做的是向我的库中添加一些异步重载,使.NET4.5中使用wait关键字的用户更容易进行异步编程。现在重载的方法是非异步的。此外,我自己也不想使用任何异步方法,只需创建新方法并使其可用即可 是否可以在.NET 4.0和VS2010中创建异步方法?如果可以,那么.NET 4.0异步方法应该是什么样子 因为我使用的是VS2010,所以我无法访问“async”关键字,所以在.NET4.0中模拟这种行为需要做些什么?例如,它是否需要返回

我有一个.NET项目,它使用.NET4.0和VS2010中的C#

我想做的是向我的库中添加一些异步重载,使.NET4.5中使用wait关键字的用户更容易进行异步编程。现在重载的方法是非异步的。此外,我自己也不想使用任何异步方法,只需创建新方法并使其可用即可

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


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

最简单的方法是返回一个
任务或一个
任务。那就足够了

然而,只有当方法真正异步执行时,这才有意义

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

提示:只向方法中添加async没有任何作用。您的方法将按顺序执行并返回已完成的任务。使方法返回一个任务必须有特定的用途——通常是因为方法本身是异步执行的(如web服务调用或文件IO)


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

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

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

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

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


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

正如其他人所说的,您可以从返回
Task
Task
的方法开始。这足以
在.NET 4.5中等待其结果

要使您的方法尽可能适合未来的异步代码,请遵循(也可用)中的指导原则。它提供命名约定和参数建议,例如用于支持取消

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

  • 如果已有基于IAsyncResult的异步方法,请使用
  • 如果您有另一个异步系统,请使用

我想要重载的方法(添加了异步后缀)不是异步的。我读过的.NET4.5示例似乎通过添加“async”关键字使方法自动异步。我想知道如何在.NET4.0中复制它。我更新了我的问题,所以这更清楚了。我把我的回答编辑成了答案。如果您只想在不同的线程上生成方法代码,请在调用者中使用Task.Factory.StartNew。您不需要为此更改方法。@JamesNewton-King:异步方法总是返回
void
Task
Task
。从调用方的角度来看,它如何返回
任务
任务
在很大程度上是不相关的。我认为你应该多读一点异步方法的真正作用。“如果你的方法只包含计算而没有IO(或只包含阻塞IO),通常最好不要使它异步,因为这样做没有任何好处。”@Chin这样做会有什么好处?由调用方启动并行性或将计算从UI线程中移出。线程不是这种计算方法的业务。此外,我还想添加一种明显的可能性,即在使用VS 2012或更高版本进行编译时使用
async/await
,或者使用框架实现、包实现,或者(仅限专家使用)您自己动手。@JeanHominal:虽然
async
方法肯定是最简单的方法,但它不在本问题的范围之内,因为op仅限于VS2010。当用户要求.NET 4.0时,提供的答案是针对.NET 4.5的。@hc1:不,答案是描述4.0中可用的方法(返回
Task
/
Task
Task.Factory.fromsync
TaskCompletionSource
)。