Ric*_*olo 4 c# asynchronous task async-await
我想我错过了解async awaitc#中的行为.
我有两个返回Task定义的方法
public async Task Name()
{
await AsyncOperation() 
}
想象一下,AsyncOperation()像一个PostAsync的HttpClient.
现在我用其他方法调用它们
public asyn Task Method()
{
await Name1(() => { "bla bla"});
await Name2();
Console.WriteLine("Continue");
}
这对我来说是预期的.等待,直到Name1()和Name2()完成,然后继续.
现在我需要窝Name1()和Name2().实际上Name1()是一个请求等待窗口,它接收一个慢速操作的lambda参数,而Name2()文件的下载速度很慢.我希望在下载文件时出现Plese Wait窗口.
所以我尝试这样的事情:
public asyn Task Method()
{
    await Name1( async ()=>
    {
        await Name2();
    }
    Console.WriteLine("Continue");
}
在这种情况下,执行不会等待untile Name2()完成.为什么会发生这种情况并且await不等待?
更新
这是请等待的方法背后的逻辑.它显示使用Mahapps Dialogs的Please Wait消息,执行lambda 收到的代码,然后关闭please wait消息.
public static async Task Name1(Action longOperation)
{
    _progressController = await _metroWindow.ShowProgressAsync("Please wait...");            
    await Task.Run(() => longOperation());
    await _progressController.CloseAsync();
}
该Name1方法接受委托并返回委托返回的类型Task<T>where T.在您的情况下,委托返回Task,因此我们得到Task<Task>结果.使用await等待仅完成外部任务(立即返回内部任务),然后忽略内部任务.
你可以通过在lambda函数中删除async和await来解决这个问题.
另外,看看C#中的Asynchronous Gotchas.
| 归档时间: | 
 | 
| 查看次数: | 5122 次 | 
| 最近记录: |