在C#和XAML中取消按钮的功能性

4
我是一名有用的助手,可以为您翻译文本。

我正在尝试为一个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);
    }

“AnalysisClick”函数是由名为“Begin”的按钮启动的。 “CancelClick”按钮的目标是停止分析并提供对话框,通知用户测试已停止。最佳方法是什么?
编辑:根据用户建议,我正在研究“BackgroundWorker”和Microsoft异步编程模型。

2
我会使用 BackgroundWorker 并设置 WorkerSupportsCancellation = true; - paul
2
可以使用 BackgroundWorker 或者 Task 以及 CancellationToken(需要 .Net 4.0 或更高版本)来实现。 - Falanwe
1
请注意,在你的BackgroundWorker任务中,取消支持是你必须在分析过程中构建的一项功能--需要在执行过程中检查用户是否已请求取消。另外,在美式英语中,"canceled"只有一个"l"。 - Jay
1
请查看 Microsoft 异步编程模型。这将有助于解决您的问题。 - RockWorld
感谢您的快速回复!唯一需要注意的是,不幸的是必须使用 .Net 3.5。但我一定会研究 BackgroundWorker - wjhguitarman
1个回答

2

我同意上面对你问题的评论,但如果你想快速尝试一些东西,任务(Tasks)是一种非常好的异步操作方式,可以取消这些任务。像这样的代码应该可以工作,或者至少可以让你开始:

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中,可以在/之前编写取消任务的代码,其中更有意义的是中止昂贵的操作/循环等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接