c# - 使用 .NET 4 任务库在 WPF 中显示阻塞消息框

标签 c# .net .net-4.0

我的 WPF 应用程序中有以下代码:

Task task = Task.Factory.StartNew(() => {
        DoInitialProcess();
    });

task.ContinueWith(t => 
    Dispatcher.BeginInvoke((Action)(() => {
        MessageBox.Show("Error: " + t.Exception.InnerExceptions[0].Message);
    })), TaskContinuationOptions.OnlyOnFaulted);

如果发生异常,它会成功触发继续并显示消息框,但不会阻止主 UI 线程上的输入。

为什么它不阻塞主 UI 线程,让它阻塞的最佳方法是什么?

最佳答案

一般来说,这通常是通过适当的 TaskScheduler 完成的,而不是通过 Dispatcher.BeginInvoke。尝试以下操作:

task.ContinueWith(t => 
{
    MessageBox.Show("Error: " + t.Exception.InnerExceptions[0].Message);
},
CancellationToken.None, 
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());

假设您是在 UI 线程中创建此任务,以上内容应该会按您预期的方式工作。

但是,如果您在后台线程上启动此任务,则需要提供一种干净的方法来获取正确的 TaskScheduler 以继续执行。这可以通过在窗口构造期间获取调度程序或其他方式来完成,然后在以后使用它。

关于c# - 使用 .NET 4 任务库在 WPF 中显示阻塞消息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932805/

相关文章:

c# - 使用 RuleForEach 时如何访问正在验证的集合项?

.net - 由于文件不存在,项目 x 未导入(路径长度问题)

c# - WCF .svc 工作但不是配置文件

.net - 采用默认 web.config 并增加 maxStringContentLength 所需的更改

.net - 无法在控制台应用程序中引用 System.Web

visual-studio-2010 - 如何从 GAC 引用程序集?

c# - 如何在 C# 中对具有原始顺序的列表进行排名

c# - 属性/方法定义

c# - 在什么场景下我们需要创建一个新的线程?

Java RAD 组件/架构 - 对 .NET 开发人员的建议?