如果我有一个我想要异步的普通方法:
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
在我的理解中,你只需要async和await当你编写一个在内部进行异步调用的方法时,但你希望它看起来不像.换句话说,您希望编写和读取代码,就像它是一些正常的顺序代码一样,处理异常就好像它是正常的顺序代码一样,返回值就好像它是正常的顺序代码一样.然后编译器的责任是用保留逻辑的所有必要的回调重写该代码.
你的方法很简单我根本不认为它需要重写,你可以只返回任务,但是消费它的人可能想要await它的返回值.
我为什么这样做:
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) => {});我希望该方法只是在不停止的情况下运行,但我希望触发类似回调的东西,因此是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生成一个值后恢复.它就像你的其他代码一样,但更容易阅读.*耸肩*