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

标签 c# .net wpf multithreading

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

使用上面的当前实现,代码可以编译并运行,但是任务完成后 Progress 表单不会关闭。有什么想法吗?

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

谢谢。

最佳答案

好吧,正如我在评论中提到的,当用户在 Window_Closing 事件中使用 e.Cancel=true 单击关闭按钮时,我阻止了 Progress 窗口的关闭。这也阻止了代码中关闭窗口的调用。

在意识到我根本不需要自定义委托(delegate)后,我更新了 RanToCompletion 方法:

public void RanToCompletion(Task task)
    {
        if (_frmProgress.Dispatcher.CheckAccess())
            _frmProgress.Close();
        else
            _frmProgress.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(_frmProgress.Close));
    }

关于c# - 使用 Dispatcher.Invoke 从 WPF 中的不同线程关闭窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747469/

相关文章:

wpf - 如何传递IValueConverter参数?

javascript - 需要一个正则表达式来检查字符串中的 "2 alphabets and 4 numeric"

c# - 如何检测 .NET 中的电子邮件大小问题

c# - 类似于 Ruby on Rails 中的 C# 代码

c# - 静态变量变为空

c# - 如何将项目插入 List<T> 而不会将该索引处的项目撞到后面?

c# - 各种 Microsoft.CodeQuality.* 分析器之间有什么区别?

c# - 当 WPF 中的文本更改时对 TexBox 强制执行验证

wpf - 我的 WPF 应用程序中的 SaveFileDialog 异常

c# - Entity Framework Code First 是否支持存储过程?