Dav*_*ury 113 c# asynchronous async-await
有人可以解释这对同步方法意味着什么吗?如果我尝试改变方法async然后VS抱怨它.
这有效:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想知道这究竟是什么意思: Task.FromResult<object>(null);
Sri*_*vel 193
async方法与普通方法不同.无论你从async方法中返回什么都包含在一个Task.
如果你没有返回值(void)它将被包装Task,如果你返回int它将被包装Task<int>等等.
如果您的异步方法需要返回,则int您将方法的返回类型标记为,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
}
Run Code Online (Sandbox Code Playgroud)
Sameway,当你返回Task<object>你的方法时,返回类型应该是Task<Task<object>>
public async Task<Task<object>> MethodName()
{
return Task.FromResult<object>(null);//This will compile
}
Run Code Online (Sandbox Code Playgroud)
由于您的方法正在返回Task,因此不应返回任何值.否则它将无法编译.
public async Task MethodName()
{
return;//This should work but return is redundant and also method is useless.
}
Run Code Online (Sandbox Code Playgroud)
请记住,没有await语句的异步方法不是async.
Maj*_*jor 45
使用async时需要使用await关键字,函数返回类型应该是通用的以下是返回值的示例:
public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
这是一个没有返回值的示例:
public async Task MethodName()
{
await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
阅读这些:
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
异步:http://msdn.microsoft.com/en-us/library/hh156513.aspx 等待:http://msdn.microsoft.com/en-us/library/hh156528.aspx
Jer*_*man 23
添加async关键字只是语法糖,可以简化状态机的创建.从本质上讲,编译器会接受您的代码;
public async Task MethodName()
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
把它变成;
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
如果您的代码有任何await关键字,编译器必须采用您的方法并将其转换为类来表示执行它所需的状态机.在每个await关键字,变量的状态和堆栈将保留在类的字段中,类将自己添加为您正在等待的任务的完成挂钩,然后返回.
该任务完成后,您的任务将再次执行.因此,在方法的顶部添加了一些额外的代码,以恢复变量的状态并跳转到代码的下一个平板.
请参阅async和await生成什么?一个血腥的例子.
这个过程与编译器使用yield语句处理迭代器方法的方式有很多共同之处.
| 归档时间: |
|
| 查看次数: |
183702 次 |
| 最近记录: |