MVP pattern+async+update UI

465
29 июня 2017, 01:06

Есть некая задача, по которой надо обработать данные в массиве из большого количества элементов. Данные, это кадастровые номера, по которым надо запросить, с некоторого сайта, данные.

Есть так же форма, на которой лежит 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 через пару слоёв, то пока не понял как сделать.

READ ALSO
Работа с XML средствами C#

Работа с XML средствами C#

Имееться xml файл, нужно из этого файла выцедить и записать в лист, проблема в том что у меня получаеться выцедить только 1 экземпляр

255
ComboBox в grid KENDO winform, загрузка и добавление

ComboBox в grid KENDO winform, загрузка и добавление

Grid загружается через BindingSource, в grid включено добавление, удаление, редактированиеКак сделать так что бы в первом столбце находился combobox и при...

200
Построение дерева по Хаффману C#

Построение дерева по Хаффману C#

Проблема заключается в коллекции param, в которой создаётся деревоС первыми двумя выражениями все нормально

231
ScrollViewer прокрутка до элемента

ScrollViewer прокрутка до элемента

Есть ScrollViewerВнутри него лежит StackPanel

265