async await返回任务

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>.编译器将转换intTask<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.

  • 应该是`return await Task.FromResult <object>(null);` (4认同)
  • @Prokurors你也需要等待`DoStuff()`.例如:`var x = await DoStuff();` (3认同)
  • @ProfK`Task.WhenAny`就是一个例子. (2认同)

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

  • 你可以直接返回`null`而不是等待一个虚拟任务. (9认同)
  • @Lee,但如果你这样做,编译器会抱怨(发出警告)`async`方法将异步执行,并建议在方法的某处使用`await`关键字.我建议只使用`return Task.FromResult((object)null);`并删除`async`关键字以减少编译器警告噪音. (5认同)
  • 相对于非常不切实际的投票方式,它具有如此众多的神秘投票,这应该是可以接受的。 (3认同)

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语句处理迭代器方法的方式有很多共同之处.