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

本文关键字:显示 消息 WPF NET4 任务 使用 | 更新日期: 2023-09-27 18:20:54

我的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线程,最好的方法是什么?

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

通常情况下,这通常是通过适当的TaskScheduler而不是通过Dispatcher.BeginInvoke来实现的。尝试以下操作:

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

如果您在UI线程中创建此任务,那么上面的操作应该符合您的预期。

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