【发布时间】:2013-05-11 12:37:21
【问题描述】:
假设我们想要显示一个对话框,当在task1 中获得异常时,我们从该对话框调用一个方法,该方法启动一个新的task2。问题是所有者窗口在task2 期间冻结。
请看一下简单的代码(Task Parallel Library 使用):
private void button1_Click(object sender, RoutedEventArgs e)
{
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew
(() => SomeHardMethod(1)).ContinueWith(TaskContinuation, scheduler);
}
private void TaskContinuation(Task parentTask)
{
if (parentTask.IsFaulted)
{
// If we get an exception - show a dialog that starts a new task
var dlg = new WindowDialog();
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
if (dlg.Show())
{
//Here we start a new task
Task.Factory.StartNew
(() => SomeHardMethod(2)).ContinueWith(TaskContinuation, scheduler);
}
var ex = parentTask.Exception;
}
}
private void SomeHardMethod(int mode)
{
if (mode == 1)
{
throw new ArgumentException("mode");
}
else
{ //Any long operation...
Thread.Sleep(3000);
}
}
对我来说,奇怪的是,当我第一次在 button1_Click 方法中启动任务时它不在 UI 中执行,但是当我第二次启动一个新任务时它在 UI 线程中执行,所以这就是所有者窗口冻结的原因。
谁能澄清为什么这部分代码实际上不是在后台启动任务?
if (dlg.Show())
{
//Here we start a new task
Task.Factory.StartNew
(() => SomeHardMethod(2)).ContinueWith(TaskContinuation, scheduler);
}
【问题讨论】:
-
WindowDialog到底是什么,Show()有什么作用? -
它实际上并没有发生。在我的情况下,它只显示一个窗口,并且有一个按钮,只需关闭它(DialogResult = true)
-
它应该 ShowDialog() 窗口。细节很重要。
标签: c# wpf responsive-design task-parallel-library synchronizationcontext