4

WPF アプリのキャンセル ボタンの機能をハッシュ化しようとしています。現在、私が注目している 2 つの機能があります。

    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 」ボタンの目的は、分析を停止し、テストが停止されたことをユーザーに通知するダイアログ ボックスを提供することです。これを達成するための最良の方法は何ですか?

EDIT 私は現在、ユーザーの提案に従ってMicrosoft Asynchronous Programming ModelBackgroundWorkerを調査しています。

4

1 に答える 1

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 内の操作の肉の近く/前に書くことができます。そこでは、高価な操作/ループなどを中止する方が理にかなっています。

于 2012-10-10T17:23:20.863 に答える