我的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线程,最好的方法是什么呢?
一般来说,通常这样做的方式是通过适当的方式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
.这可以通过在窗口构造期间抓取调度程序或其他方式来完成,然后再使用它.
归档时间: |
|
查看次数: |
1486 次 |
最近记录: |