我有一个任务,完成后应该继续执行另一个显示 winform 的任务(winform 之前已在 UI 线程上初始化,因此它确实有一个句柄)。
private static Task RunningTask
{
get;
set;
}
public static UpdaterTool.Forms.UpdateResult UpdateResultForm;
private void DoWork()
{
UpdateResultForm = new Forms.UpdateResult();
//the next line forces the creation of the handle -
//otherwise InvokeRequired will later on return false.
var hackHandle = UpdateResultForm.Handle;
var ctx = TaskScheduler.FromCurrentSynchronizationContext();
RunningTask = Task.Factory.StartNew(() => DownloadAndInstallFiles(), CancelTokenSource.Token)
.ContinueWith(_ => WorkComplete(), CancelTokenSource.Token, TaskContinuationOptions.NotOnFaulted, ctx);
}
private void WorkComplete()
{
ShowResultForm();
}
private void ShowResultForm()
{
if (UpdateResultForm.InvokeRequired)
{
try
{
UpdateResultForm.Invoke(new MethodInvoker(ShowResultForm));
}
catch { }
return;
}
UpdateResultForm.Show();
}
问题是,无论我使用哪种 ContinueWith() 重载组合,UpdateResultForm 要么根本不显示(这意味着继续没有发生,工作人员在“运行”时挂起),或者当它是时,它挂起UI,就像它期望工作线程完成或其他东西一样。我不明白为什么当我尝试使用 FromCurrentSynchronizationContext() 在 UI 线程上显示它时会发生这种情况。
据我了解,在 DoWork 方法中,我从 UI 线程开始(这就是我在那里初始化表单的原因)。当代码进入 Task.Factory.StartNew 时,它切换到工作线程。完成后,它会继续 WorkComplete,它只在 UI 线程上显示先前初始化的表单。
我错过了什么?谢谢,