为什么使用async并等待Task <>?

Sha*_*ean 14 c# async-await

如果我有一个我想要异步的普通方法:

public int Foo(){}
Run Code Online (Sandbox Code Playgroud)

我会做:

public Task<int> FooAsync(){
    return Task.Run(() => Foo());
}
Run Code Online (Sandbox Code Playgroud)

我为什么这样做:

public async Task<int> FooAsync(){
    return await Task.Run(() => Foo());
}
Run Code Online (Sandbox Code Playgroud)

我计划使用它的方式是:

FooAsync().ContinueWith((res) => {});
Run Code Online (Sandbox Code Playgroud)

我希望方法只是在不停止的情况下运行,但是我希望触发类似回调的东西,因此ContinueWith.但是对于第二个版本,有没有必要使用它?

Max*_*kin 13

在我的理解中,你只需要asyncawait当你编写一个在内部进行异步调用的方法时,但你希望它看起来不像.换句话说,您希望编写和读取代码,就像它是一些正常的顺序代码一样,处理异常就好像它是正常的顺序代码一样,返回值就好像它是正常的顺序代码一样.然后编译器的责任是用保留逻辑的所有必要的回调重写该代码.

你的方法很简单我根本不认为它需要重写,你可以只返回任务,但是消费它的人可能想要await它的返回值.

  • 另外,您可能想阅读[我应该为同步方法公开异步包装吗?](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx)(答案差不多如果你有一个同步方法,那么总是"不";然后给它一个同步方法签名). (2认同)

Mud*_*Mud 5

我为什么这样做:

 public async Task<int> FooAsync()
 {
  return await Task.Run(() => Foo());
 }
Run Code Online (Sandbox Code Playgroud)

你不会.您以前的版本返回已经等待的任务.这个新版本不会添加任何内容.

我计划使用它的方式是:

  FooAsync().ContinueWith((res) => {});
Run Code Online (Sandbox Code Playgroud)

我希望该方法只是在不停止的情况下运行,但我希望触发类似回调的东西,因此是ContinueWith.

这就是差异所在.让我们充实你的榜样:

void DoAsyncStuff()
{
    FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) });
}
Run Code Online (Sandbox Code Playgroud)

使用async,您可以编写如下相同的代码:

void async DoAsyncStuff()
{
    int res = await FooAsync();
    DoSomethingWithInt(res);
}
Run Code Online (Sandbox Code Playgroud)

结果是一样的.该await关键字将您的方法的其余部分转换为一个延续,在FooAsync生成一个值后恢复.它就像你的其他代码一样,但更容易阅读.*耸肩*