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.WriteLineStopwatch

PS 你也应该避免async void,正如我在我的 MSDN 文章中更详细地解释的那样。

PPS 由于您是新手async,我推荐我自己的介绍文章,该文章末尾有 (IMO) 最佳后续资源的链接。

于 2013-08-21T22:51:51.213 回答