У меня есть задача, которая после завершения должна продолжить другую задачу, которая показывает winform (винформа ранее была инициализирована в потоке пользовательского интерфейса, поэтому у нее есть дескриптор).
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 либо вообще не отображается (имеется в виду продолжение не происходит, воркер зависает на "запуске"), либо когда есть, то зависает пользовательский интерфейс, например, ожидание завершения рабочего потока или что-то в этом роде. Я не понимаю, почему это происходит, когда я пытался показать это в потоке пользовательского интерфейса, используя FromCurrentSynchronizationContext().
В моем понимании, внутри метода DoWork я запускаю UI-поток (поэтому я инициализирую форму именно там). Когда код входит в Task.Factory.StartNew, он переключается на рабочий поток. Когда он завершается, он продолжает работу с WorkComplete, который просто показывает ранее инициализированную форму в потоке пользовательского интерфейса.
Что мне не хватает? Спасибо,
DoWork()
? Вы вызываете его из потока пользовательского интерфейса? - person svick   schedule 21.07.2012