Проблемы с конструкцией async\await при использовании WPF или Windows Forms - C#
Формулировка задачи:
Добрый день!
Написал библиотечку, использующую, в том числе конструкции async-await. Всё работает, при компиляции в виде консольного приложения, выполняется на ура.
Подключил библиотечку к WPF-проекту, пытаюсь использовать (там, собственно, обращение к одному методу)... и наблюдаю зависание. Смотрю: где затык. Оказывается вот где:
Поясняю:
1. Некий метод обращается к асинхронному методу, который выбирает - что именно асинхронно прочитать в XDocument. Под каждый part этого XDocument имеется свой асинхронный метод.
2. Например, TradeAsync это:
3. Затык оказывается в методе PartsParser. Если быть точным, то команды после await не выполняются и до синхронизирующего исключения из List никогда не доходят. Я только начал разбираться с async-await. И вроде как написано, что после завершения потока, команды в методе, который асинхронно вызывал другой метод с await - должны бы выполнятся. И они выполняются, если это не WPF или WinForms.
Вопрос в следующем: почему?
Также происходит и с WinForms. Подключаю библиотеку, запускаю... наблюдаю, что команды после await не исполняются... Подскажите - в чем проблема? Что я упускаю?
Заранее благодарю.
... 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); // используется для синхронизации потоков. }
private async Task<int> TradeAsync(IEnumerable<XElement> partElements) return await Task.Run(() => { int count = 0; foreach (XElement subPartElement in partElements) ... return count; }); }
Решение задачи: «Проблемы с конструкцией async\await при использовании WPF или Windows Forms»
textual
Листинг программы
while (_inWorkList.Count > 0) { }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д