使用Dispatcher.Invoke从WPF中的不同线程关闭窗口



我有一个问题,即使在查看了有关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();

对于上面的当前实现,代码会编译并运行,但一旦任务完成,Progress表单就不会关闭。有什么想法吗?

我也愿意接受其他解决这个问题的想法。也许我完全走错了路。

谢谢。

正如我在评论中提到的,当用户在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));
    }

最新更新