我的 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/