簡體   English   中英

等待task.delay有助於更快地刷新UI,但是如何?

[英]await task.delay helps in UI refresh faster, but how?

我有一個視圖模型,該視圖模型正在提取一行記錄並在Windows Phone UI上顯示。.這種提取數據的視圖模型方法正在執行許多任務,所有任務都標記有Await操作。

如下圖所示:

async Task GetData()
{

    var dataCollection = await GetSomeData();
    await DoThis();
    await DoThat();
}

調用“ DoThis”調用后,UI刷新。 現在,我剛剛觀察到,如果在其他任務完成之前在代碼中引入Task.Delay,則UI會立即刷新。這是我最初的目標,要在“ GetSomeData”返回后立即刷新UI,然后觸發其他任務。

如下圖所示:

async Task GetData()
{
    var dataCollection = await GetSomeData();
    await Task.Delay(100);
    await DoThis();
    await DoThat();
}

因此,據我了解,在調用Task.Delay之后,UI線程就有機會刷新。 但是,如果沒有Task.Delay,則如果調用DoThis,則會浪費一些時間,直到它在“ DoThis”中找到第一個可等待的方法,以便它可以返回並繼續執行UI Refresh。

我的問題是:

  1. 我了解正確嗎?
  2. 將其放入生產代碼中安全嗎?

在此先感謝您,希望我能解釋清楚。

下面是這些方法的詳細信息,因為沒有這些方法,不清楚程序中正在執行什么操作。

async Task<ObservableCollection<MyModel>> GetSomeData()
{
    return await Task.Run(() =>
    {
        using (var db = new MainModelDataContext())
        {
            List<MyModel> temp =
                db.Models.Where(Some condition)
                  .Take(30)
                  .ToList();
            var returnCollection = new ObservableCollection<MyModel>(temp);
            return returnCollection;
        }
}

ObservableCollection綁定到UI頁面上的列表控件。 頁面視圖模型正在調用此方法。

async Task DoThis()
{
   // do some data processing and then post that to the Server 
   // this is the first awaitable method after the data processing

   await (an HttpClientHandler).PostAsync();
}

Task DoThat()也遵循與DoThis相同的流程。數據處理也包裝在async-await Tasks中,它們僅在某些類屬性上起作用。

希望我清楚..再次感謝大家

當您調用Task.Delay ,您將控制權返回到UI消息循環持續了100毫秒,並且UI消息循環有機會處理其隊列中的更多消息。 這就是為什么您遇到“刷新”效果的原因。 如果您的GetSomeData方法是真正的異步方法,則您的UI應在其操作期間保持響應狀態,並在完成后將繼續執行下一個await

如果這種影響沒有發生,則意味着您的方法並不是真正的異步方法,並且更有可能它們以同步方式運行昂貴的操作,從而阻塞了您的UI線程。

在將其投入生產之前,您必須研究為什么需要Task.Delay來刷新UI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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