4

Dispatcher.Invokeのいろいろな情報を見ても解決できない問題があります。

タスクを作成し、そのタスクを開始し、進行状況ウィンドウを開く MainWindow があります。タスクが完了したら、進行状況ウィンドウを閉じる必要があります。ここに私が持っているものがあります:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Task task = new Task(_vm.WriteToDB);
        task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
        task.ContinueWith(RanToCompletion, TaskContinuationOptions.OnlyOnRanToCompletion);
        task.Start();

        _frmProgress = new Progress(task);
        _frmProgress.DataContext = _vm;
        _vm.ProgressText = "Connecting to update server...";
        _frmProgress.ShowDialog();
    }

    public void RanToCompletion(Task task)
    {
        Progress.FormCloseDelegate FormCloseDelegate = new Progress.FormCloseDelegate(_frmProgress.Close);

        if (_frmProgress.Dispatcher.CheckAccess())
            _frmProgress.Close();
        else
            _frmProgress.Dispatcher.Invoke(DispatcherPriority.Normal, FormCloseDelegate);
    }

FormCloseDelegate は進行状況ウィンドウで定義されます。

public delegate void FormCloseDelegate();

上記の現在の実装では、コードはコンパイルおよび実行されますが、タスクが完了しても進行状況フォームは閉じられません。何か案は?

これを解決するための他のアイデアも歓迎します。たぶん、私は完全に間違った道を進んでしまったのです。

ありがとうございました。

4

1 に答える 1

7

コメントで述べたように、ユーザーが Window_Closing イベントで e.Cancel=true を使用して閉じるボタンをクリックしたときに、進行状況ウィンドウを閉じるのをブロックしていました。これは、ウィンドウを閉じるためのコード内の呼び出しもブロックしていました。

カスタム デリゲートがまったく必要ないことに気付いた後、RanToCompletion メソッドを更新しました。

public void RanToCompletion(Task task)
    {
        if (_frmProgress.Dispatcher.CheckAccess())
            _frmProgress.Close();
        else
            _frmProgress.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(_frmProgress.Close));
    }
于 2012-07-31T23:07:39.573 に答える