c# - 等待深度嵌套在堆栈上的方法

标签 c# wpf c#-4.0 async-await

假设在某个时候至少有 10 个方法在堆栈中可用,但未完成。其中许多方法都在处理对 UI 产生影响的操作。此时,我想发出保存命令。保存命令可以成功完成,也可以失败。根据结果​​,我想做不同的操作,然后才将执行返回到那些留在堆栈上的方法。

现在,如果我同步运行 Save 命令,就没有问题了。我想异步执行 Save 命令,将执行返回给消息泵 (UI),而堆栈上的所有代码(方法)都应等待 SaveCommand 完成。

现在,正如我对 await 的理解,不能保证调用将在同一线程(在我的例子中是 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 }

关于c# - 等待深度嵌套在堆栈上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19406942/

相关文章:

c# - 四舍五入到两位小数

c# - 标准方法与扩展方法

c# - 由于 Fody 错误无法编译项目。 Fody(或任何其他代码)没有任何改变

WPF 可以禁用窗口中的所有点击事件

c# - 一些C#可选参数的可选规范

c# - 为什么 WebClient.OpenRead 在 Windows Server 2008 R2 上超时

c# - 如何将两个任务结果合并为第三个任务?

c# - 是否可以使用 Response.Redirect 附加 header ?

c# - 公开原始模型而不是单个属性时的 INotifyPropertyChanged

c# - 如何在数据上下文更改时以编程方式更改绑定(bind)