asynchronous等待返回任务

有人可以解释什么是这意味着一个同步方法? 如果我尝试将方法更改为async然后VS抱怨它。

这工作:

 public Task MethodName() { return Task.FromResult<object>(null); } 

这不起作用:

 public async Task MethodName() { return Task.FromResult<object>(null); } 

所以基本上我想知道这意味着什么: Task.FromResult<object>(null);

async方法与普通方法不同。 无论你从async方法返回什么都包装在一个Task

如果你没有返回任何值(void),它将被包装在Task ,如果你返回int ,它将被包装在Task<int> ,等等。

如果你的asynchronous方法需要返回int你会把方法的返回types标记为Task<int> ,你将返回plain int而不是Task<int> 。 编译器会将int转换为Task<int>给你。

 private async Task<int> MethodName() { await SomethingAsync(); return 42;//Note we return int not Task<int> and that compiles } 

Sameway,当你返回Task<object>你的方法的返回types应该是Task<Task<object>>

 public async Task<Task<object>> MethodName() { return Task.FromResult<object>(null);//This will compile } 

由于您的方法正在返回Task ,它不应该返回任何值。 否则它不会编译。

 public async Task MethodName() { return;//This should work but return is redundant and also method is useless. } 

请记住,没有await语句的asynchronous方法不是async

在使用async时需要使用await关键字,而函数的返回types应该是通用的这里是一个返回值的例子:

 public async Task<object> MethodName() { return await Task.FromResult<object>(null); } 

这是一个没有返回值的例子:

 public async Task MethodName() { await Task.CompletedTask; } 

阅读这些:

TPL: http : //msdn.microsoft.com/en-us/library/dd460717( v=vs.110) .aspx和任务: http : //msdn.microsoft.com/en-us/library/system.threading .tasks(v = vs.110)的.aspx

asynchronous: http : //msdn.microsoft.com/en-us/library/hh156513.aspx等待: http : //msdn.microsoft.com/en-us/library/hh156528.aspx

添加async关键字只是语法糖,以简化状态机的创build。 本质上,编译器需要你的代码;

 public async Task MethodName() { return null; } 

把它变成;

 public Task MethodName() { return Task.FromResult<object>(null); } 

如果你的代码有任何关键字,编译器必须把你的方法变成一个类来表示执行它所需的状态机。 在每个await关键字中,variables的状态和堆栈将保存在类的字段中,类将自己添加为正在等待的任务的完成钩子,然后返回。

当这个任务完成后,你的任务将再次执行。 因此,一些额外的代码被添加到方法的顶部,以恢复variables的状态并跳转到代码的下一块。

看看asynchronous和等待生成什么? 为一个血淋淋的例子。

这个过程与编译器用yield语句处理迭代器方法的方式有许多共同之处。