Проблемы с конструкцией async\await при использовании WPF или Windows Forms - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Написал библиотечку, использующую, в том числе конструкции async-await. Всё работает, при компиляции в виде консольного приложения, выполняется на ура. Подключил библиотечку к WPF-проекту, пытаюсь использовать (там, собственно, обращение к одному методу)... и наблюдаю зависание. Смотрю: где затык. Оказывается вот где:
...
foreach (XElement rootElement in rootElements.Elements())
    PartsParser(rootElement.Name.LocalName, rootElement.Elements());
...
 
private async void PartsParser(string partName, IEnumerable<XElement> partElements)
{
            _inWorkList.Add(partName);
            int count = 0;
            switch (partName)
            {
                ...
                case "Trade":
                    count = await TradeAsync(partElements);
                    break;
                case "WorldOutlooks":
                    count = await WorldAsync(partElements);
                    break;
                case "Buildings":
                    count = await BuildingAsync(partElements);
                    break;
                ...
            }
            Log("Заголовки раздела " + partName + " загружены (" + count + " шт.)";
            _inWorkList.Remove(partName); // используется для синхронизации потоков.
        }
Поясняю: 1. Некий метод обращается к асинхронному методу, который выбирает - что именно асинхронно прочитать в XDocument. Под каждый part этого XDocument имеется свой асинхронный метод. 2. Например, TradeAsync это:
private async Task<int> TradeAsync(IEnumerable<XElement> partElements) 
         return await Task.Run(() =>
            {
                int count = 0;
                foreach (XElement subPartElement in partElements)
                ...
                return count;
            });
        }
3. Затык оказывается в методе PartsParser. Если быть точным, то команды после await не выполняются и до синхронизирующего исключения из List никогда не доходят. Я только начал разбираться с async-await. И вроде как написано, что после завершения потока, команды в методе, который асинхронно вызывал другой метод с await - должны бы выполнятся. И они выполняются, если это не WPF или WinForms. Вопрос в следующем: почему? Также происходит и с WinForms. Подключаю библиотеку, запускаю... наблюдаю, что команды после await не исполняются... Подскажите - в чем проблема? Что я упускаю? Заранее благодарю.

Решение задачи: «Проблемы с конструкцией async\await при использовании WPF или Windows Forms»

textual
Листинг программы
while (_inWorkList.Count > 0) { }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.167 из 5
Похожие ответы