Nano Hash - криптовалюты, майнинг, программирование

Замораживание пользовательского интерфейса с помощью async/await

У меня есть код, который зависает, если вы схватите и переместите окно во время его загрузки. Я не уверен, в чем проблема, но решил опубликовать свой код, так как я довольно новичок в работе с async/await и просто задаюсь вопросом, есть ли какие-то проблемы с моей логикой. Я не говорю, что это вызывает проблему, я просто искал и видел другие проблемы, связанные с зависанием пользовательского интерфейса и часто возникающими 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);
    }
}

Спасибо.

21.08.2013

Ответы:


1

async не волшебным образом избавит вас от проблем с пользовательским интерфейсом, но, безусловно, поможет вам справиться с ними.

В этом случае ваш метод BuildActual (который должен называться BuildActualAsync) сначала асинхронно ожидает DoStuff и MakeTimeSeries в фоновом потоке (который должен использовать Task.Run вместо TaskFactory.StartNew).

Все идет нормально. После завершения выполнения делегата BuildActual возобновляет выполнение в потоке пользовательского интерфейса и запускает DoMoreStuff синхронно (в этом потоке).

Таким образом, ваши проблемы, скорее всего, связаны с тем, что DoMoreStuff занимает слишком много времени. Если вы все еще не уверены, профилирование приложений (или даже Debug.WriteLine в сочетании с Stopwatch) даст вам больше информации о том, где поток пользовательского интерфейса становится занятым.

P.S. Вы также должны избегать async void, как я более подробно объясняю в своей статье MSDN.

П.П.С. Поскольку вы новичок в async, я рекомендую мою вводную статью, в которой есть ссылки в (IMO) лучшие последующие ресурсы в конце.

21.08.2013
  • Спасибо за подробное руководство/ссылки для начинающих. На самом деле я обнаружил, что проблема не связана с кодом, но статьи все равно помогли. 22.08.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..