c# - 嵌套 Async Await 不等待

标签 c# asynchronous task async-await

我想我误解了 c# 中 async await 的行为。

我有两个方法返回定义如下的Task

public async Task Name()
{
await AsyncOperation() 
}

AsyncOperation() 想象成 HttpClientPostAsync

现在我在一些其他方法中调用它们

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/

相关文章:

android - 在 DialogFragment 中缓慢加载自定义 ArrayAdapter 时,在哪里实现异步任务?

javascript - 动态加载 javascript,检查所有 javascript 何时加载

javascript - 如何从异步调用返回响应?

c# - 多个变量之间的相等比较

c# - 如何在不调用属性更改的情况下验证使用 IDataErrorInfo 和 WPF 更改的不同属性?

c# - 如何创建自定义 SynchronizationContext 以便所有延续都可以由我自己的单线程事件循环处理?

c# - 'await' 有效,但调用 task.Result 挂起/死锁

c# - 如何将Dispatcher或Task的值传递给外部?

c# - GetStringAsync 从不返回,执行异步 GET 的正确方法

c# - App.config 验证