Jam*_*ing 41 .net c# async-await .net-4.5
我有一个在.NET 4.0和VS2010中使用C#的.NET项目.
我想做的是为我的库添加一些异步重载,以便使用await关键字为.NET 4.5中的用户更容易地执行异步编程.现在,正在重载的方法是非异步的.此外,我不想自己使用任何异步方法,只需创建新方法并使其可用.
是否可以在.NET 4.0和VS2010中创建异步方法,如果是这样,.NET 4.0异步方法应该是什么样的?
因为我正在使用VS2010,所以我无法访问"async"关键字,因此需要在.NET 4.0中模拟这种行为?例如,它是否需要返回任何特定类型,并且是否需要在方法内部发生任何代码以使其调用的当前非异步代码异步发生?
Ste*_*ary 32
正如其他人所说,你从一个方法返回Task
或开始Task<TResult>
.这足以await
在.NET 4.5中得到结果.
要使您的方法尽可能适应未来的异步代码,请遵循基于任务的异步模式文档(也可在MSDN上获得)中的指导原则.它提供命名约定和参数建议,例如,用于支持取消.
为了实现您的方法,您有以下几种选择:
IAsyncResult
基于现有的异步方法,请使用Task.Factory.FromAsync
.TaskCompletionSource<TResult>
.最简单的方法是返回a Task
或a Task<T>
.那就足够了.
但是,这只有在您的方法真正异步执行时才有意义.
我还建议您遵循通常的命名模式,如AbcAsync("Async"后缀).您的调用者不会注意到使用C#5创建的异步方法有任何差异(因为没有).
提示:只是向方法添加异步不会做任何事情.您的方法将按顺序执行并返回已完成的任务.使方法返回任务必须服务于某个目的 - 通常这样做是因为该方法本身是异步执行的(如Web服务调用或文件IO).
如果你的方法只包含计算但没有IO(或者只是阻塞IO),那么通常最好不要使它异步,因为你没有做到这一点.异步方法并不总是在单独的线程上执行.如果最后一句话让你感到惊讶,你可能想要深入研究一下这个话题.