2014-02-25 52 views
1

我正在設計一個遵循MVVM模式的WPF應用程序。但是當涉及到多線程問題時,我發現我的知識相當有限。我的問題與標題完全相同:我可以在工作線程中創建ViewModel對象嗎?我可以從工作線程初始化ViewModel嗎?

目前我們沒有使用任何依賴注入,所以我只是在UI線程的View的構造函數中創建ViewModel對象(我想這不是最佳實踐)。但是現在有一個問題:我們有一個核心類,我們稱之爲CoreContext,來自我們的遺留軟件,它負責許多核心任務,我們的軟件和數據庫之間的數據訪問層就是其中之一。我們的ViewModel許多人持有對CoreContext作爲數據成員的一個引用。不幸的是,這個類不是線程安全的。當我在UI線程中創建ViewModel實例(並因此創建CoreContext實例)時,確保CoreContext只能在擁有線程中訪問。但是,當涉及一些繁重的數據庫查詢時,UI將無法響應。

所以現在我想知道,是否有可能在非UI線程來實例化ViewModel(因此CoreContext實例)所以當VM(最終CoreContext)正在重查詢的用戶界面可以響應?

+0

你可能會更期待看待/異步。這將允許你的數據庫查詢異步運行,同時仍然在GUI線程上運行。 – GazTheDestroyer

+0

@GazTheDestroyer,顯然,OP在這裏處理傳統的數據訪問層,可能不會將其轉換爲「async/await」。 – Noseratio

回答

1

我不認爲在非UI線程上創建和更新ViewModel是個好主意。但是,如果你真的需要,沒有任何事情阻止你這樣做。您只需要使整個ViewModel線程安全,即在訪問數據字段的任何地方使用適當的鎖,包括屬性獲取器/設置器。應該爲整個ViewModel對象層次結構完成。

WPF框架將自動爲數據綁定的UI控件(至少在.NET 4.5,AFAIK)中編組INotifyPropertyChanged.PropertyChanged通知。這樣,控件將在主UI線程上自動更新自己,如預期的那樣。

重要的是:如果設置或獲取任何ViewModel屬性啓動涉及傳統數據訪問層的後臺操作,則必須在最初創建數據訪問層的同一線程上進行此類操作。也就是說,爲它實現線程關聯。

+1

感謝您的回答。這也是我的感受。這就是阻礙我的原因:我們試圖儘可能多地訪問DAL類中的數據,因爲我們實現了Cache/WeakReference進行加載。但是由於這個DAL不是線程安全的,有時候很難使用它。正如您所指出的,由於我們的ViewModel通常將DAL作爲成員,因此它們應該在相同/專用線程 – tete

+0

@tele中啓動,這可能有助於爲您的傳統DAL實現線程關聯:http://stackoverflow.com/問題/ 20993007 /如何使用的,非線程安全的,異步等待的API和圖案,與-ASP網的Web-API – Noseratio

相關問題