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

Sak*_*o73 4 .net c# .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);
Run Code Online (Sandbox Code Playgroud)

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

为什么不阻止主UI线程,最好的方法是什么呢?

Ree*_*sey 5

一般来说,通常这样做的方式是通过适当的方式TaskScheduler,而不是通过Dispatcher.BeginInvoke.请尝试以下方法:

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

如果您在UI线程中创建此任务,则上述应该按照您期望的方式工作.

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