完了すると、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 に入ると、作業スレッドに切り替わります。完了すると、以前に初期化されたフォームを UI スレッドに表示するだけの WorkComplete に進みます。
私は何が欠けていますか?ありがとう、