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

时间:2012-09-03 03:53:10

标签: c# async-await

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

public int Foo(){}

我愿意:

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

我为什么要这样做:

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

我计划使用它的方式是:

FooAsync().ContinueWith((res) => {});

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

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

  

我为什么要这样做:

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

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

  

我计划使用它的方式是:

  FooAsync().ContinueWith((res) => {});
     

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

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

void DoAsyncStuff()
{
    FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) });
}

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

void async DoAsyncStuff()
{
    int res = await FooAsync();
    DoSomethingWithInt(res);
}

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