14

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

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. 但是对于第二个版本,使用它有什么意义吗?

4

2 回答 2

13

在我的理解中,您只需要async并且await当您编写一个在内部执行一些异步调用的方法时,但您希望它看起来不像。换句话说,你想像普通的顺序代码一样编写和读取代码,像普通的顺序代码一样处理异常,像普通的顺序代码一样返回值等等。然后编译器的职责是使用所有必要的回调来重写该代码,以保留逻辑。

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

于 2012-09-03T04:55:49.710 回答
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 产生一个值后恢复。它就像您的其他代码一样,但更易于阅读。*耸耸肩*

于 2013-02-19T18:25:01.790 回答