簡體   English   中英

使用MVVM模式實現異步“loadData”方法的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM