JT *_*ith 3 c# asynchronous async-await
我试图将我创建的一些异步方法链接在一起,我相信对于我如何工作有一些根本的误解
这是我的代码的表示:
public async Task<bool> LoadFoo()
{
return await Foo.ReadAsync("bar").ContinueWith((bar) =>
{
Foo.ReadAsync("baz").ContinueWith((baz) =>
{
Foo.ReadAsync("qux").ContinueWith((qux) =>
{
return true;
});
return true;
});
return true;
});
}
public void LoadEverything()
{
LoadFoo().ContinueWith((blah) =>
{
OtherLoadMethod();
});
}
Run Code Online (Sandbox Code Playgroud)
现在我期待调用LoadEverything()时,LoadFoo("bar","baz"和"qux")中的所有ReadAsync方法都会运行并完成,并且在它们全部完成之后,在LoadEverything中的.Continue将运行这样,在"bar","baz"和"qux"ReadAsync方法完成之前,OtherLoadMethod()不会执行.
我实际看到的是LoadFoo被调用,然后在LoadFoo中获得最终完成之前,OtherLoadMethod开始运行(继续使用"qux"ReadAsync).
有人可以帮助澄清我的错误吗?为什么在ReadAsync("qux")完成并返回true之前,不会执行OtherLoadMethod?
Pet*_*iho 10
为什么在ReadAsync("qux")完成并返回true之前,不会执行OtherLoadMethod?
因为那是await有效的.您注册的延续只是:延续.它们不是在当前方法中同步执行的.您告诉框架当前任务完成时,应该执行继续.Task返回的对象ContinueWith()允许您在发生时观察完成情况.Task如果ContinueWith()方法被阻塞直到执行继续,则甚至不需要返回对象.
同样,Task<bool>您的LoadFoo()方法返回表示方法的整体完成,包括await...ContinueWith()您返回的方法.该方法在完成延续之前返回,并且如果需要等待继续完成,则调用者应该使用返回的任务.
所有这一切,我不明白你为什么一开始使用ContinueWith().你显然可以访问await,这是处理延续的现代,惯用的方式.恕我直言,你的代码看起来应该是这样的(不清楚为什么你要返回Task<bool>而不是Task,因为返回值只是永远true,但我认为你可以自己解决这个问题):
public async Task<bool> LoadFoo()
{
await Foo.ReadAsync("bar");
await Foo.ReadAsync("baz");
await Foo.ReadAsync("qux");
return true;
}
public async Task LoadEverything()
{
await LoadFoo();
await OtherLoadMethod();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3833 次 |
| 最近记录: |