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

4

我在我的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线程,以及使其阻塞的最佳方法是什么?

1个回答

5
通常情况下,这个操作应该通过正确的 TaskScheduler 来完成,而不是通过 Dispatcher.BeginInvoke。请尝试以下方法:
task.ContinueWith(t => 
{
    MessageBox.Show("Error: " + t.Exception.InnerExceptions[0].Message);
},
CancellationToken.None, 
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());

如果您在UI线程中创建此任务,则上述内容应按您的预期工作。

然而,如果您在后台线程上启动此任务,则需要提供一种清晰的方法来获取正确的TaskScheduler以进行下一步操作。这可以通过在窗口构造期间或其他某些方式中获取计划程序,然后稍后使用它来完成。


谢谢你的回答。事实证明,我在不同的线程上,而不是UI线程上,所以我必须像你建议的那样,在窗口创建时获取UI TaskScheduler。一旦我这样做了,你的代码就完美地运行了。再次感谢。 - Sako73

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接