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 在 Progress 窗口中定义:

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 回答