9

次のような奇妙なコードを観察しています。

var task = new Task(...); // run in the background, do something lengthy work
task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext());
task.Start();

そこで 2 番目のタスクがイベントを呼び出し、それが次に GUI を更新しようとすると、恐ろしいクロススレッド例外が発生します。

Thread.CurrentThread.ManagedThreadId2 番目のタスクのメソッドを確認すると、実際には UI スレッドで実行されていないことがわかります。

タスクを生成したコードは、UI スレッドで実行されています。

これがうまくいかないシナリオはありますか?

4

1 に答える 1

4

.NET 4.0 を使用していると仮定するとSystem.Threading.SynchronizationContext.Current、メイン スレッドの が null になるバグがあり、この問題が発生します。問題を簡単に再現できる場合は、最初SynchronizationContext.Currentに を呼び出したときに が nullかどうかを確認しますTaskScheduler.FromCurrentSynchronizationContext()

ここでその問題の詳細を参照してください: SynchronizationContext.Current is null in Continuation on the main UI thread

このバグは .NET 4.5 で修正されています。

于 2013-03-20T13:32:51.963 に答える