如果我有一个我想要异步的普通方法:
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
。但是对于第二个版本,有没有意义使用它?
答案 0 :(得分:13)
根据我的理解,当你编写一个在内部执行异步调用的方法时,你只需要async
和await
,但你希望它看起来不是{ EM>。换句话说,您希望编写和读取代码,就像它是一些正常的顺序代码一样,处理异常就好像它是正常的顺序代码一样,返回值就好像它是正常的顺序代码一样。然后编译器的责任是用保留逻辑的所有必要的回调重写该代码。
你的方法很简单我根本不认为它需要重写,你可以只返回任务,但是消费它的人可能想要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生成值后将继续执行。它就像你的其他代码一样,但更容易阅读。 *耸肩*