[英]Best way to implement an async “loadData” method using the MVVM pattern
我試圖了解在調用更新我的ViewModel的異步方法時使用的最佳方法是什么。 現在,讓我說我有這樣的事情:
視圖:
private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
//Call my ViewModel method to update the data the UI is bound to
}
視圖模型:
public async Task loadData()
{
this.Source = await loadStuffFromDatabaseAsync();
}
現在,我不確定應該使用以下哪種方法:
1)在我的LoadState方法中,使用:
await Task.Run(async () => { await ViewMode.loadData(); });
2)使用Task.Run而不等待Action內的loadData方法:
await Task.Run(() => { ViewModel.loadData(); });
3)調用我的loadData方法:
await ViewModel.loadData().ConfigureAwait(false);
4)調用loadData方法而不在我的View類中等待它,並在我的loadData方法中使用Task.Run:
視圖:
private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
ViewModel.loadData();
}
視圖模型:
public async void loadData()
{
await Task.Run(async () =>
{
this.Source = await loadStuffFromDatabaseAsync();
});
}
這些協議之間的主要區別是什么?
一個比另一個更高效,我應該特別選擇一個嗎?
謝謝你的幫助! :)
塞爾吉奧
如果您Task.Run
UI線程移出CPU綁定或阻塞工作,則應該只使用Task.Run
。 情況並非如此,因此直接調用(選項3)是最自然的。
輪流拿走它們:
await Task.Run(async () => { await ViewMode.loadData(); });
此選項將在線程池線程上執行loadData
。 這可能無法很好地工作,因為loadData
正在更新UI(通過設置VM屬性間接)。 即使它確實發生了工作(即,某些MVVM框架可以在某些情況下正確處理來自后台線程的更新),但由於loadData
是一種異步方法,因此可能沒有必要。
此外,它無緣無故地添加async
狀態機開銷。
await Task.Run(() => { ViewModel.loadData(); });
此選項具有所有相同的問題,除了它稍微更高效,因為它沒有async
狀態機開銷。 但它仍然在后台線程上更新VM屬性並且不必要地使用后台線程。
public async void loadData()
這是最糟糕的。 它繼承了其他問題:在后台線程上更新VM屬性並使用不必要的后台線程。 為此,它增加了async void
的問題。 一個問題是NavigationHelper_LoadState
無法捕獲來自loadData
任何異常。 另一個問題是loadData
不容易測試。
所以只需使用簡單的方法並直接調用它:
await ViewModel.loadData().ConfigureAwait(false);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.