我正在使用MVVM模式爲Windows Store和Windows Phone 8開發同一應用程序的兩個版本。每個應用都有自己的視圖。 Model和ViewModel在Portable Class Libraray中共享。我使用TPL任務在模型中執行異步操作。由於可移植類庫的限制,我無法使用async和await關鍵字。如何在異步操作後返回到UI線程
任務完成後,我想回到UI線程並更新一些屬性(這會導致ViewModel和View也更新)。
在我看來,這似乎是一個很常見的情況,所以我有點困惑,爲什麼它變得如此艱難。
我嘗試了兩種不同的方法:在開始操作
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
然後將它傳遞給ContinueWith
方法之前
一個(不工作)
保存到調度一個參考。
myTask.ContinueWith(t => myTaskCompleted(t.Result), scheduler);
在我看來,這似乎是一個很好的解決方案,但不起作用。 myTaskCompleted仍然在不同的線程中執行。
二
現在我試圖使用
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, handler);
因爲我不能從PCL使用分派器直接,我傳遞給它(隱藏在一個包裝)的引用,以幾乎所有的對象在模型中。 (就像在這answer)這最後的作品,但它是相當複雜和醜陋。
所以我的問題是:
- 這是建議的方式要回UI線程便攜類Libraray裏面?
- 我嘗試的錯誤是什麼一個?
我知道那裏已經有很多關於這個話題的問題,但不幸的是沒有真正解決我的問題。
第一次嘗試時代碼的上下文是什麼?請記住,如果您目前不在UI線程中,那麼TaskScheduler.FromCurrentSynchronizationContext()不會獲取UI線程的上下文。如果您已經在後臺線程中,則爲時已晚,您需要早一點抓取它。 – Servy 2013-03-12 21:07:23
Duplicate:http://stackoverflow.com/questions/11258164/portable-class-library-equivalent-of-dispatcher-invoke-or-dispatcher-runasync(至少他們看起來是一樣的我) – 2013-03-12 21:07:53
你看着[ Microsoft.Bcl.Async(http://nuget.org/packages/Microsoft.Bcl.Async/)?你的第一種方法對我來說是正確的 - 除非@Servy建議你的'FromCurrentSynchronizationContext'不在UI線程上運行。 – 2013-03-12 21:13:19