Асинхронная/ожидающая проблема с результатом
Привет. У меня есть проблема с async/await, так как результат не всегда один и тот же.
Проблема в том, что файлы всегда одни и те же, но результаты разные. Иногда показывает мне результат, иногда другой результат.
Что я делаю не так?
Что я уже пробовал:
У меня есть метод в моей форме, который возвращает количество некоторых конкретных элементов из xml.
private int GetNumberOfMissingElements(string filePath) { int i = 0; XDocument xml = XDocument.Load(filePath); foreach (XElement xe in xml.Descendants("someElement")) { if (xe.Descendants("someSpecificChild").Count() == 0) { i++; } } return i; }
Этот метод я хочу использовать в событии щелчка кнопки, асинхронно на нескольких файлах. Пока я возвращаю целочисленное значение из этого метода, я хочу увеличить свойство в моей форме, которое будет отображаться в текстовом поле на моей форме.
private async void CountTotalMissingElements(DataTable files) { foreach(DataRow r in files.Rows) { string filePath = r["FilePath"].ToString(); var result = await Task.Run(() => GetNumberOfMissingElements(filePath)); TotalMissingElements += result; } }
И моя собственность TotalMissingElements является:
private int totalMissingElements; public int TotalMissingElements { get => totalMissingElements; set { totalMissingElements = value; if(txtTME.InvokeRequired) { txtTME.BeginInvoke((MethodInvoker)delegate () { txtTME.Text = totalMissingElements.ToString(); } } else { txtTME.Text = totalMissingElements.ToString(); } } }
С уважением,
Вали
Gerry Schmitz
Выведите каждый "результат", чтобы подтвердить, является ли разбор или добавление проблемой. Возможно, вам нужно "блокировать" общие переменные.
Vali Maties
Хорошо. Я сделал этот тест. Консольный текст я скопировал в csv и импортировал, отсортировал и сравнил в OpenOffice SCalc. Кажется, данные в порядке, но результат был другим. Практически, "TotalMissingElements += result;" не делает того, что должно! Почему?
Что я должен делать в этом случае?
Кстати: что означает "блокировать общие переменные"? :)
Vali Maties
Хорошо. Эта "блокировка" сделала мой день :D я провел некоторое исследование (я не так экспериментировал программистом в C#) и узнал, как использовать Interlock.Add()!
Спасибо тебе, Джерри!
Gerry Schmitz
Всегда пожалуйста! Рад, что вы поняли ссылку на "блокировку"; документы более интересны, чем я.
Tobynate
Вероятно, это не решение, но вы должны вернуть тип async Task при использовании await commant