5

ロード中にウィンドウをつかんで移動するとフリーズするコードがいくつか実行されています。問題が何であるかはわかりませんが、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);
    }
}

ありがとう。

4

1 に答える 1

18

async魔法のように UI の問題がなくなるわけではありませんが、問題の管理に役立つことは間違いありません。

この場合、BuildActualメソッド (という名前にする必要があります ) は、最初にバックグラウンド スレッド (の代わりに使用する必要がありBuildActualAsyncます) を非同期に待機しDoStuffています。MakeTimeSeriesTask.RunTaskFactory.StartNew

ここまでは順調ですね。デリゲートの実行が完了すると、UI スレッドで実行がBuildActual再開され、 (そのスレッドで) 同期的に実行されます。DoMoreStuff

したがって、あなたの問題は、DoMoreStuff時間がかかりすぎることが原因である可能性があります。それでもわからない場合は、アプリケーションのプロファイリング (またはDebug.WriteLineと組み合わせてStopwatch) を使用すると、UI スレッドがビジー状態になっている場所をより詳しく把握できます。

PS また、MSDN の記事で詳しく説明しているため、も避ける必要があります。async void

PPS あなたは を初めて使用するので、私自身の紹介記事asyncをお勧めします。この記事の最後には、(IMO) 最良のフォローアップ リソースへのリンクがあります。

于 2013-08-21T22:51:51.213 に答える