Проблемы с конструкцией 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) { }