C# 使用.NET4任务库在WPF中显示阻塞消息框

C# 使用.NET4任务库在WPF中显示阻塞消息框,c#,.net,.net-4.0,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);

我的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线程,以及让它这样做的最佳方法是什么?

通常,这通常是通过适当的
任务调度程序来完成的,而不是通过
调度程序.BeginInvoke
。请尝试以下操作:

task.ContinueWith(t => 
{
    MessageBox.Show("Error: " + t.Exception.InnerExceptions[0].Message);
},
CancellationToken.None, 
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
如果您在UI线程中创建此任务,则上述操作应按您预期的方式进行


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

谢谢你的回答。事实证明,不知何故,我与UI处于不同的线程上,我必须按照您的建议在创建窗口时使用UI任务调度器。一旦我这么做了,你的代码就运行得很好。再次感谢。