等待深度嵌套在堆栈上的方法
本文关键字:方法 堆栈 深度 嵌套 等待 | 更新日期: 2023-09-27 18:35:33
假设在某个时候至少有 10 个方法在堆栈上可用,因为尚未完成。其中许多方法正在处理对 UI 产生影响的操作。此时,我想发出一个保存命令。保存命令可以成功完成,也可以失败。根据结果,我想执行不同的操作,然后才将执行返回到堆栈上留下的那些方法。
现在,如果我同步运行保存命令,则没有问题。我想异步执行 Save 命令,将执行返回到消息泵 (UI),而堆栈上的所有代码(方法)都应该等待 SaveCommand 完成。
现在,正如我所理解的等待,不能保证将在同一线程(在我的情况下是 UI 线程)上进行调用。因此,我不能只等待调用的第一个方法(堆栈中所有其他方法的父方法),因为如果启动不同的线程,它将引发 UI 异常(从不同线程访问 UI 元素)。
那么,如何处理这种情况呢?示例代码:
public bool PropertyName {get; set { MethodA(); // some code after };}
public void MethodB() { MethodC(); // some code after }
public void MethodC() { MethodD(); // some code after }
public void MethodD() { MethodE(); // some code after }
// etc
void MEthodK()
{
Save();
}
如果你想(异步)等待一个方法,只需await
从该方法返回的Task
:
public async Task MethodCAsync() { await MethodDAsync(); // some code after }
public async Task MethodDAsync() { await MethodEAsync(); // some code after }
async Task MethodKAsync()
{
await Save();
}
这将导致属性 setter 出现问题,它现在必须是一个异步方法:
public bool PropertyName { get; private set; }
public async Task SetPropertyNameAsync() { await MethodAAsync(); // some code after }
除非调用 ConfigureAwait()
,否则从 UI 线程await
Task
将始终恢复在 UI 线程上运行代码。
您不必担心。