簡體   English   中英

使用async / await凍結UI

[英]Freezing UI with async/await

我有一些代碼運行,如果你在加載時抓住並移動窗口,它將凍結。 我不確定問題是什么,但我想我會發布我的代碼,因為我在處理async / await方面相當新,只是想知道我的邏輯是否存在問題。 我不是說這導致了這個問題,我剛剛搜索並看到了其他問題,因為UI凍結和async / await經常出現。 任何幫助,將不勝感激。

private async void BuildChart()
{
    DateTime date = DateTime.Today;
    using (Database db = new Database())
    {
        await BuildActual(date, db);
        await BuildActual(date.AddDays(1),db);
    }
}

private async Task BuildActual(DateTime date, Database db)
{
    List<TimeSeries> actualValues = await Task<List<TimeSeries>>.Factory.StartNew(() =>
    {
        try
        {
            var wind = DoStuff(date, db);
            if (wind == null) return null;
            if (wind.Count == 0) return null;
            return MakeTimeSeries(wind);
        }
        catch
        {
            return null;
        }
    });

    try
    {
        if (actualValues == null) return;
        DoMoreStuff(actualValues);
    }
    catch (Exception ex)
    {
        Logger.Log(ex);
    }
}

謝謝。

async不會神奇地讓你的UI問題消失,但它肯定會幫助你管理它們。

在這種情況下, BuildActual方法( 應該命名為 BuildActualAsync )首先在后台線程上異步等待DoStuffMakeTimeSeries應該使用Task.Run而不是TaskFactory.StartNew )。

到現在為止還挺好。 委托完成執行后, BuildActual繼續在UI線程上執行並同步運行DoMoreStuff (在該線程上)。

因此,您的問題可能是由於DoMoreStuff占用了太多時間。 如果您仍然不確定,應用程序分析(甚至Debug.WriteLineStopwatch結合使用)可以讓您更深入地了解UI線程忙碌的位置。

PS你還應該避免async void ,我在MSDN文章中有更詳細的解釋。

PPS由於你是async新手,我推薦我自己的介紹文章 ,該文章鏈接到(IMO)最后的最佳后續資源。

暫無
暫無

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

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