C# 嵌套异步等待不等待

C# 嵌套异步等待不等待,c#,asynchronous,task,async-await,C#,Asynchronous,Task,Async Await,我想我误解了c#中asyncwait的行为 我有两个方法返回任务,定义如下 public async Task Name() { await AsyncOperation() } 想象一下AsyncOperation()就像HttpClient的PostAsync 现在我在其他方法中调用它们 public asyn Task Method() { await Name1(() => { "bla bla"}); await Name2(); Console.WriteLine("Con

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

我有两个方法返回
任务
,定义如下

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()
是一个请等待的窗口,接收lambda参数是一个缓慢的操作,而
Name2()
是一个缓慢的文件下载。我希望下载文件时出现Plese Wait(请等待)窗口

所以我试着这样做:

public asyn Task Method()
{
    await Name1( async ()=>
    {
        await Name2();
    }
    Console.WriteLine("Continue");
}
在这种情况下,执行不会一直等到
Name2()
完成。为什么会发生这种情况而
等待
不等待

更新

这就是“请等待”方法背后的逻辑。它使用显示请等待消息,执行lambda接收的代码,然后关闭请等待消息

public static async Task Name1(Action longOperation)
{
    _progressController = await _metroWindow.ShowProgressAsync("Please wait...");            
    await Task.Run(() => longOperation());
    await _progressController.CloseAsync();
}

Name1
方法接受一个委托并返回一个
Task
,其中
T
是委托返回的类型。在您的例子中,代理返回
Task
,因此我们得到
Task
作为结果。使用
wait
仅等待外部任务(它立即返回内部任务)的完成,然后忽略内部任务

您可以通过删除lambda函数中的async和wait来修复此问题


另外,请看一下。

如果不使用lambda的Name1方法的代码,很难说。它对lambda的内部作用是什么?他不能修改他的
任务。运行
等待任务。运行(async()=>await long operation())
将控制权返回给调用成员,直到长操作完成?通过这种方式,他的等待一直在进行,包括嵌套的等待?@JohnathonSullinger,如果
longOperation
已经是异步的(返回
Task
),您很少需要用
Task.Run来包装它。只有在
longOperation
的开头有一大块阻塞或CPU密集型代码,或者您希望在不同步的情况下执行它时,这才有意义。上下文如果您包装它,
wait Task.Run(()=>longOperation())
就足够了(不需要
async
lambda)。