2013-08-21 4 views
5

ロード中にウィンドウをつかんで移動すると、フリーズするコードがいくつかあります。私は問題が何であるか分からないが、async/awaitを使って作業していて、ロジックに問題があるかどうか疑問に思っているので、コードを投稿すると思った。私はこれが問題を引き起こしているとは言いません、私はちょうど検索し、UIのフリーズアップと非同期/待機が頻繁に来る他の問題を見てきました。どんな助けもありがとう。async/aswaitでフリーズする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

関連する問題