1

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

现在,如果我同步运行 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();
}
4

2 回答 2

3

如果您想(异步)等待一个方法,只需从该方法返回awaitTask

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 }
于 2013-10-16T16:06:23.437 回答
2

除非您调用ConfigureAwait(),否则从 UI 线程调用awaitaTask将始终恢复在 UI 线程上运行您的代码。
你不必担心。

于 2013-10-16T15:08:06.557 回答