最佳答案
在我的C#/XAML Metro应用程序中,有一个按钮可以启动一个长时间运行的进程。因此,按照建议,我使用async/await来确保UI线程不会被阻塞:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await GetResults();
}
private async Task GetResults()
{
// Do lot of complex stuff that takes a long time
// (e.g. contact some web services)
...
}
有时,GetResults中发生的事情需要额外的用户输入才能继续。为简单起见,我们假设用户只需单击“继续”按钮。
我的问题是:如何以等待事件(如单击另一个按钮)的方式暂停GetResults的执行?
这里有一个丑陋的方法来实现我正在寻找的:继续按钮的事件处理程序设置一个标志..
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
...GetResults会定期轮询它:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
投票显然很糟糕(忙着等待/浪费周期),我正在寻找一些基于事件的东西。
有什么想法吗?
顺便说一句,在这个简化的示例中,一种解决方案当然是将getResults()拆分为两个部分,从Start按钮调用第一部分,从Continue按钮调用第二部分。实际上,GetResults中发生的事情更加复杂,在执行过程中的不同点可能需要不同类型的用户输入。因此,将逻辑分解为多个方法并不是一件小事。