2011-07-05 82 views
2

我目前正在開始使用.NET Prism框架來開發WPF應用程序。我無法確定的一件事是實現對WCF服務或數據庫的異步調用的最佳方式?原因是,我不希望WCF /數據庫調用阻止UI線程,這會導致UI凍結直到操作完成。.NET Prism4 WVVM + WPF異步調用最佳實踐

從我的理解,應該是我的架構如下:

View (WPF) <=> View Model <=> Application Services <=> DB/WCF 

難道我實現使用類似的AsyncDelegateCommand視圖模型的異步行爲?如果我這樣做,那麼我無法在應用程序服務中維護任何狀態,因爲設置任何狀態都需要在UI線程中完成(除非有解決方法)。

因此,另一種選擇是在應用程序服務中提供帶回調的異步方法,並讓應用程序服務爲異步操作生成線程/任務。

我簡要介紹了Prism StockTrader參考實現,他們似乎沒有異步執行任何操作。我覺得這應該是一個非常普遍的問題,並且必須有一些最佳實踐來解決這個問題。

+0

哦,還有一件事......你並不需要一個「AsyncDelegateCommand」。 –

回答

3

我還沒有找到任何關於「最佳實踐」的內容。

我個人認爲以下設置好:View <= BINDING => ViewModel <==> DataRepository/DataAccessLayer (Async Calls)

至於與DAL保持您的視圖模型同步,你可以做一對夫婦因事上所需要的數據進行同步:

  • 爲您的模型集合公開ReadOnlyObservableCollection<T>並在內部(從DAL內)管理其後備集合。
  • 對於單個項目返回該項目的新實例並加載異步完成事件上的項目。
  • 此外,學會愛EventAggregator(它不是過於複雜 - 雖然,網上有改進 - EventAggregator Extension)。它有很多幫助。最好用這個來宣佈「正在工作」和「已完成」的事件。

基本上,因爲服務基準發生器,有助於建立異步調用你的,只是這項工作,並使用您的DataRepository/DAL在內部管理數據暴露給你的ViewModels和EventAggregator引用通告工作/完成。


我也應該說這個......你可以選擇讓你的DAL完全同步,並擁有所有異步調用/從它的視圖模型,因爲你可能會想揭露一些類型IsWorking的」 /完成「屬性讓視圖知道某事正在發生或已完成。我認爲關鍵是確保你堅持一個層的所有異步(不是視圖)。在ViewModel層上做它使得構建異步調用的編碼工作更多,但它更加乾淨。你只是DAL同步做事,不必發佈完成/ isworking事件。事實上,我實際上會說這是比較常見的方法。

+0

所以基本上,ViewModel應該進行調用並收聽已完成的事件。異步應該在ViewModel下完成。 EventAggregator是一個有趣的想法。但是,我的問題是,大多數情況下,我只希望調用者獲得異步請求的結果。在這種情況下,我認爲從ViewModel發送回調將是適當的。 – Mas

+0

好吧,我不喜歡讓我的DAL與我的ViewModel緊密結合,所以我不想將完成的事件綁定到ViewModel。相反,CompletedEvent是在DAL內部處理的,所以我永遠無法進入添加/刪除事件處理程序的熱門事件(不必擔心內存泄漏)。如果我需要從DAL完成/工作到「誰在監聽」(ViewModel),我使用EventAggregator。此外,服務生成器自動爲您建立異步方法是很好的:) –

+0

我更新了答案以反映更簡單的選擇。這不是一個黑/白的決定,但關鍵是保持您的異步性在一層,以幫助避免內存泄漏和意想不到的結果。 –