2015-05-25 51 views
0

我在我的ViewModel這種方法querys從數據庫項目:製作方法運行異步和線程安全

public void GetProducts(DateTime date1, ...) 
{ 
    var list = SQLQuery.GetProducts(DateTime date1, ...); 

    Products = list.ToList(); 
} 

在我所說的觀點是這樣的方法:

await Task.Run(() => vm.GetProducts(...)); 

這是我發現的簡單方法是爲了在方法運行時使UI響應。問題是我無法第二次運行該方法。

編譯器說,將由該方法提供的集合視圖不再是線程安全的。

到目前爲止,我已經嘗試使用Dispatcher來運行該方法,但是我沒有找到一個離開來運行它的異步並保持await運算符。

回答

3

您應該分開的兩個 - 讓產品在後臺線程,然後更新UI線程的UI:

public IEnumerable<Product> GetProducts(DateTime date1, ...) 
{ 
    return SQLQuery.GetProducts(DateTime date1, ...).ToList();  
} 

,要求把這樣的:

var products = await Task.Run(() => vm.GetProducts(...)); 
vm.Products = products; 

雖然我建議這個邏輯作爲命令或類似的東西移動到視圖模型中。

+0

這對我很有用。其中一個問題是使用ObservableCollection。 – celsoap7