我想我误解了 c# 中 async
await
的行为。
我有两个方法返回定义如下的Task
public async Task Name()
{
await AsyncOperation()
}
将 AsyncOperation()
想象成 HttpClient
的 PostAsync
。
现在我在一些其他方法中调用它们
public asyn Task Method()
{
await Name1(() => { "bla bla"});
await Name2();
Console.WriteLine("Continue");
}
这符合我的预期。等到 Name1()
和 Name2()
完成,然后继续。
现在我需要嵌套 Name1()
和 Name2()
。事实上,Name1()
是一个 Please Wait Window,它接收 lambda 参数是一个缓慢的操作,而 Name2()
是一个缓慢的文件下载。我希望在下载文件时出现 Plese Wait 窗口。
所以我尝试这样的事情:
public asyn Task Method()
{
await Name1( async ()=>
{
await Name2();
}
Console.WriteLine("Continue");
}
在这种情况下,执行不会等到 Name2()
完成。为什么会发生这种情况而 await
不等待?
更新
这就是please wait方法背后的逻辑。它使用 Mahapps Dialogs 显示请稍候消息, 执行 lambda 接收到的代码,然后关闭请等待消息。
public static async Task Name1(Action longOperation)
{
_progressController = await _metroWindow.ShowProgressAsync("Please wait...");
await Task.Run(() => longOperation());
await _progressController.CloseAsync();
}
最佳答案
Name1
方法接受委托(delegate)并返回 Task<T>
其中 T
是委托(delegate)返回的类型。在您的情况下,代表返回 Task
, 所以我们得到 Task<Task>
作为结果。使用 await
仅等待外部任务完成(立即返回内部任务),然后忽略内部任务。
您可以通过删除 lambda 函数中的 async 和 await 来解决此问题。
另外,看看 Asynchronous Gotchas in C# .
关于c# - 嵌套 Async Await 不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24718724/