使用最新的CTP5和async/await关键字,我写了一些代码,显然无法编译:
class Program
{
public class MyClass
{
async public Task<int> Test()
{
var result = await TaskEx.Run(() =>
{
Thread.Sleep(3000);
return 3;
});
return result;
}
}
static void Main(string[] args)
{
var myClass = new MyClass();
//The 'await' operator can only be used in a method or lambda marked with the 'async' modifier error ??!!
int result = await myClass.Test();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
"'await'运算符的原因是什么只能用于标有'async'修饰符错误的方法或lambda?" (我选择了Visual Studio指向的行)
异步方法在调用者上下文/线程上运行同步,直到其执行路径遇到 I/O 或涉及一些等待的类似任务,然后它不等待,而是返回到原始调用者,稍后恢复其继续。问题是,实现“等待”方法的首选方式是什么。文件/网络/等异步方法是如何做到的?
假设我有一个方法,其中涉及一些等待,当前开箱即用的 IO 未涵盖这些等待。我不想阻止调用线程,也不想强迫我的调用者执行 a 来Task.Run()卸载我,我想要一个干净的异步/等待模式,以便我的调用者可以无缝集成我的库,并且我可以在其上下文上运行,直到这样我需要屈服的时候了。为了便于论证,让我们假设我想要创建一个未涵盖的新 IO 库,并且我需要一种方法来使所有保持异步的粘合在一起。
我Task.Yield还要继续吗?我必须自己做Task.Run/Task.Wait等吗?两者看起来更像是相同的抽象(这带来了如何收益的问题Yield)。我很好奇,因为有很多关于 async/await 延续如何为消费者工作以及所有 IO 库如何准备就绪的讨论,但很少有人谈论实际的“突破”点如何工作以及流程制造商应如何实现它。同步路径末尾的代码如何实际释放控制以及该方法在该点和之后如何运行。