2013-05-31 93 views
1

我有非常簡單的寧靜服務,可處理我的wpf應用程序的所有數據請求。我知道最佳實踐表明從UI線程中獲取那些長時間運行的請求。簡單的wpf mvvm異步示例

我使用.NET 4.5,所以我可以利用一些較新的工具,async/await,TPL。我創建了一些示例項目,並理解了這個概念。我似乎無法掌握的問題是處理視圖模型中的異步內容。在我的示例項目中,異步工作總是發生在代碼隱藏中 - 非常簡單。一旦它抽象到視圖模型 - 我失去它。

我有一個非常簡單的通用類,它可以處理我所有的剩餘Web請求。理想情況下,我希望異步工作在那裏發生。

回答

4

這裏就是我推薦async MVVM項目:

  • 對待你的虛擬機就像它的用戶界面的親和力。
  • 異步方法通常用於初始化和命令。
  • 屬性僅表示當前狀態。如果您發現自己試圖實施「異步屬性」,請重新評估您的設計。

這樣說,有一些技術,你可能會發現有幫助的(所有這些都是我的博客或我的AsyncEx庫的鏈接)。

我有一篇關於async and constructors的博客文章; 「異步初始化」技術(與IoC兼容)是我爲VM推薦的技術。

我也有一篇關於async and properties的博客文章;有幾種方法,包括異步延遲初始化(用於共享資源)和更新數據綁定屬性。這兩篇博客文章都是async OOP series的一部分,但這兩篇文章對於虛擬機具有有用的信息。

異步初始化和異步屬性加載都可以使用我寫的名爲NotifyTaskCompletion的幫助器類型,它基本上只是觀察任務併爲該任務提供一些數據可綁定屬性。

對於異步命令(ICommand),您可以從SimpleAsyncCommand開始,它類似於asyncDelegateCommand。更高級的類型是AsyncCommand,它支持取消,進度報告,並且只要命令已經執行,默認實現CanExecuteChanged返回false

請注意SimpleAsyncCommandAsyncCommand還不是AsyncEx的一部分,因此您必須將源代碼複製/粘貼到您自己的項目中才能使用它們。