在我的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)
...
}
Run Code Online (Sandbox Code Playgroud)
偶尔,GetResults内发生的事情需要额外的用户输入才能继续.为简单起见,假设用户只需单击"继续"按钮即可.
我的问题是:如何以等待点击另一个按钮等事件的方式暂停GetResults的执行?
这是实现我正在寻找的东西的一种丑陋方式:"继续"按钮的事件处理程序设置了一个标志......
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
Run Code Online (Sandbox Code Playgroud)
...和GetResults定期轮询它:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)
民意调查显然非常糟糕(忙碌的等待/浪费周期),我正在寻找基于事件的东西.
有任何想法吗?
顺便说一下,在这个简化的例子中,一个解决方案当然是将GetResults()分成两部分,从开始按钮调用第一部分,从继续按钮调用第二部分.实际上,GetResults中发生的事情更复杂,并且在执行中的不同点可能需要不同类型的用户输入.因此,将逻辑分解为多种方法将是非常重要的.
我创建了一个在Ubuntu 14.04计算机上作为守护进程运行的.NET Core控制台应用程序.
我想在不强制服务的情况下停止服务,能够处理kill事件.
我怎样才能做到这一点?