我正在尝试散列WPF应用程序的取消按钮的功能。目前我关注的功能有两个:
private void AnalysisClick(object sender, RoutedEventArgs e)
{
model.RunAnalysis();
}
private void CancelClick(object sender, RoutedEventArgs e)
{
model.RunAnalysis().Abort; //Pseudo-code, needs help!
MessageBox.Show("The Analysis was cancelled.", "Operation Cancelled", MessageBoxButton.YesNo);
}
使用名为Begin的按钮启动'AnalysisClick'功能。 “取消点击”按钮的目标是停止分析并提供一个对话框,通知用户测试已停止。实现这一目标的最佳方法是什么?
修改
我目前正在根据用户的建议调查BackgroundWorker
和Microsoft Asynchronous Programming Model。
答案 0 :(得分:2)
我同意上述对您的问题的评论,但是如果您想快速尝试一下,任务是一种很好的方法来执行异步操作并能够取消这些任务。这样的事情应该起作用或至少让你开始:
private CancellationTokenSource _cancelAnalysisTask = new CancellationTokenSource();
private Task _analysisTask;
private void AnalysisClick(object sender, RoutedEventArgs e)
{
_analysisTask = Task.Factory.StartNew(() =>
{
if (_cancelAnalysisTask.IsCancellationRequested)
return;
model.RunAnalysis();
});
}
private void CancelClick(object sender, RoutedEventArgs e)
{
if (_analysisTask != null)
{
_cancelAnalysisTask.Cancel();
_analysisTask = null;
MessageBox.Show("The Analysis was cancelled.", "Operation Cancelled", MessageBoxButton.OK);
}
}
这是一个快速的文章,我建议将异步功能放入ViewModel并公开命令。 UI不应该真正了解操作的细节。然后取消任务可以在ViewModel中的操作之前/之前写入,在那里更有意义中止昂贵的操作/循环/等。