2013-03-20 18 views
9

、このようなコード:Task.ContinueWith(...、TaskScheduler.FromCurrentSynchronizationContext())がUIスレッドで実行されないシナリオはありますか?私たちは奇妙な何かを観察している

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

2番目のタスクは、順番にGUIを更新しようとしたイベントが、そこに呼び出し、我々は恐ろしいクロススレッドの例外を取得します。

Thread.CurrentThread.ManagedThreadIdを2番目のタスクのメソッドからチェックすると、UIスレッド上で実行されているのはではなく、です。

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

これが間違っているシナリオはありますか?

+1

なぜTask.StartNewを実行する代わりに直接タスクを作成するのですか? –

+0

@ PanagiotisKanavos、これを行う正当な理由がある可能性があります(http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspxを参照)。しかし、これは問題に関連していません。 –

+0

私はこの事態に遭遇したり、コンテキストをヌルにしたりすることはできません。タスクを作成するための呼び出しが最初にUIスレッドで行われていない限り、 –

答えて

4

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

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

バグが.NET 4.5に固定されています。

関連する問題