Вызвать много методов в потоке пользовательского интерфейса из потоков bakcground - PullRequest
0 голосов
/ 16 октября 2018

Некоторая информация о моем вопросе:

У меня есть приложение Windows Forms, которое имеет многопоточный режим, который паралельно вычисляет в течение длительного времени.При вычислении этих потоков изменяются элементы пользовательского интерфейса (например, надписи, TextBoxes, Buttons и т. Д.) И запись в RichTextBox.У меня много делегатов для многопоточных вызовов и проверки InvokeRequired много раз.

У меня много таких методов:

private void AppendText(string text)
{
    if(richTextBox.InvokeRequired)
    {
        Invoke(myDelegate, new object[] { text });
    }
    else
    {
        richTextBox.Append(text);
    }
}

Мой вопрос:

Это хороший способ изменить элементы управления в потоке пользовательского интерфейса из фоновых потоков или я допустил некоторые архитектурные ошибки?

1 Ответ

0 голосов
/ 16 октября 2018

Ниже приведен простой код, объясняющий использование метода Async-Await

public async Task Main()
{
    var result = await Background("Test");
    // Update Ui here, its on Ui thread
}

// Executed Asynchronously in the Background
public async Task<string> Background(string text)
{
    return await Task.FromResult(text);
}
  • Background, который обрабатывается асинхронно, если он по сети, например, вызов db, то поток пула потоков не требуется, если он находится в памяти, он будет использовать поток пула потоков
  • После того, как метод Background, результат может быть обновлен в элементе управления, его автоматически Ui-поток
  • Вы даже можете использовать Task Parallel Library явно обрабатывать данные и затем обновлять результат
  • await по-прежнему является блокирующим вызовом, хотя он освобождает контекст вызова, что означает, что пользовательский интерфейс не будет зависать, он по-прежнему доступен, но его можно иметьнеблокирующий вызов с использованием Task.Run, который при возврате можно использовать для обновления пользовательского интерфейса, хотя всегда нужно предотвращать выход основного / пользовательского потока

Редактировать 1 (событие асинхронного нажатия кнопки)

public async void Button1_Click(object sender,EventArgs e)
{
   await (Async Method Call)
   // Update Ui
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...