2013-08-21 150 views
5

我有一些代碼運行,將凍結,如果你抓住並移動窗口,而它正在加載。我不確定是什麼問題,但認爲我會發布我的代碼,因爲我在與async/await合作時很新,只是想知道我的邏輯是否有問題。我並不是說這是導致問題的原因,我剛剛搜索並發現了UI凍結和異步/等待經常出現的其他問題。任何幫助,將不勝感激。凍結與異步/用戶界面

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); 
    } 
} 

謝謝。

回答

18

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

在這種情況下,你的BuildActual方法(should be namedBuildActualAsync)首先異步在後臺線程(其should be using Task.Run instead of TaskFactory.StartNew)等待DoStuffMakeTimeSeries

到目前爲止,這麼好。代理完成執行後,BuildActual在UI線程上恢復執行,並同步運行DoMoreStuff(在該線程上)。

因此,您的問題很可能是由於DoMoreStuff佔用了太多時間。如果您仍然不確定,應用程序分析(或者甚至Debug.WriteLineStopwatch的組合)可以讓您更深入地瞭解UI線程正忙於何處。

P.S.你也應該avoid async void,正如我在我的MSDN文章中詳細解釋的那樣。

P.P.S.由於您是async的新手,我建議您使用my own intro article,該鏈接可鏈接到(IMO)最後的最佳跟進資源。

+0

感謝您的深入入門指導/鏈接。我實際上發現問題與代碼無關,但文章確實有幫助。 – Kohins