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

时间:2013-10-16 15:03:51

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

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

现在,如果我同步运行Save命令,则没有问题。我想异步执行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();
}

2 个答案:

答案 0 :(得分:3)

如果您想(异步)等待方法,只需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();
}

这会导致属性设置器出现问题,现在必须是异步方法:

public bool PropertyName { get; private set; }
public async Task SetPropertyNameAsync() { await MethodAAsync(); // some code after }

答案 1 :(得分:2)

除非您致电ConfigureAwait(),否则来自UI线程的await Task将始终在UI线程上继续运行您的代码。
你不必担心它。