Есть некая задача, по которой надо обработать данные в массиве из большого количества элементов. Данные, это кадастровые номера, по которым надо запросить, с некоторого сайта, данные.
Есть так же форма, на которой лежит ProgressBar и два label's, которые показывают количество обработанных номеров и сколько номеров всего.
Дальше всё примерно так:
private async void CnfBtnOkClick(object sender, EventArgs e)
{
// ...
// cnumbers - string[] с номерами
await ParseNumbersAsync?.Invoke(cnumbers, threadCount).ConfigureAwait(true);
//...
}
Где-то в презентере
private async Task ParseNumbersAsync(string[] cnumbers, int threadcount)
{
// Делим массив на несколько массивов по количеству потоков
string[][] datas = cnumbers.Split(threadcount);
Task[] tsk = new Task[threadcount];
for(int i = 0; i < threadcount; i++)
{
tsk[i] = Task.Factory.StartNew(() => DoWork(datas[i]), TaskCreationOptions.LongRunning);
}
await Task.WhenAll(tsk).ConfigureAwait(true);
}
Внутри DoWork цикл по номерам, а внутри цикла конструкция
Task.Factory.StartNew(() => UpdateUI, CancellationToken.None, TaskCreationOptions.None, _ts);
Внутри UpdateUI progressBar.PerfomStep и обновление лейблов. И всё работает нормально.
Но тут решил переписать приложение через паттерн MVP на WinForms. ParseNumbersAsync я перенёс в презентер, а DoWork лежит в модели.
Но непонятно, как в таком случае из DoWork обновлять UI? Пробовал через контекст и Post, пробовал через Invoke и через Task.Factory.StartNew, но приложение начинает работать словно оно синхронное, форму даже подвигать нельзя. Стоит закаментить метод для обновления UI и снова появляется асинхронность.
Простые приложения с UI у меня получается делать с асинхронными операциями, а когда надо добраться до UI через пару слоёв, то пока не понял как сделать.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Имееться xml файл, нужно из этого файла выцедить и записать в лист, проблема в том что у меня получаеться выцедить только 1 экземпляр
Grid загружается через BindingSource, в grid включено добавление, удаление, редактированиеКак сделать так что бы в первом столбце находился combobox и при...
Проблема заключается в коллекции param, в которой создаётся деревоС первыми двумя выражениями все нормально