[英]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
)首先在后台線程上異步等待DoStuff
和MakeTimeSeries
( 應該使用Task.Run
而不是TaskFactory.StartNew
)。
到現在為止還挺好。 委托完成執行后, BuildActual
繼續在UI線程上執行並同步運行DoMoreStuff
(在該線程上)。
因此,您的問題可能是由於DoMoreStuff
占用了太多時間。 如果您仍然不確定,應用程序分析(甚至Debug.WriteLine
與Stopwatch
結合使用)可以讓您更深入地了解UI線程忙碌的位置。
PS你還應該避免async void
,我在MSDN文章中有更詳細的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.