2013-03-20 44 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(); 

第二項任務有要求的事件,這反過來又嘗試更新的圖形用戶界面,並且我們得到了可怕的跨線程異常。

檢查Thread.CurrentThread.ManagedThreadId從第二個任務中的方法出現,表明它實際上是而不是在UI線程上運行。

產生任務的代碼是在UI線程上運行的

有什麼情況會出現這種情況?

+1

爲什麼直接創建任務而不是運行Task.StartNew? – 2013-03-20 13:22:57

+0

@PanagiotisKanavos,可以有這樣做的(見http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx)正當理由,但這不是有密切關係的問題。 – 2013-03-20 13:36:28

+0

嗯,我不能瑞普這一點,我也沒有遇到過這種情況,或上下文變得無效,除非創建任務的調用是不是真的在UI線程首先 – 2013-03-20 13:38:06

回答

4

假設你正在使用.NET 4.0,有一個bug在主線程上System.Threading.SynchronizationContext.Current可以成爲空,你會遇到此問題。如果您可以輕鬆地重現問題,首先要檢查的是當您撥打TaskScheduler.FromCurrentSynchronizationContext()SynchronizationContext.Current爲空。

在這裏看到的細節問題:SynchronizationContext.Current is null in Continuation on the main UI thread

的BUG在.NET 4.5。

相關問題