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

Я пытался определить правильный подход к манипулированию пользовательским интерфейсом из асинхронной задачи.Мое приложение забито многопоточными вызовами и начальными вызовами.Я пытаюсь смягчить этот беспорядок, а также обеспечить немного большую отзывчивость пользовательского интерфейса, используя C # async и ожидая .

Где-то в потоке пользовательского интерфейса я инициализирую IProgress обработчик событий и передача его асинхронной функции с именем DoInfiniteWorkAsync.Эта функция бесконечно выполняется в фоновой задаче, но часто требуется обновить части пользовательского интерфейса.

   private void Form1_Load(object sender, EventArgs e)
   {
       // Create a UIEventHandler on our UI thread.
       Progress<string> UIEventHandler = new Progress<string>();
       UIEventHandler.ProgressChanged += UIEventHandler_CommandRaised;
       // Pass the UIEventHandler to our Asyncronous task.
       DoInfiniteWorkAsync(UIEventHandler);

   }
   void UIEventHandler_EventRaised(object sender, string e)
   {
       string eventMessage = e;
       // Update UI based on the event message.
   }

Моя DoInfiniteWorkAsync использует переданный в UIEventHandler отчет о UIEventMessages во время выполнения своей задачи.

    private async Task DoInfiniteWorkAsync(IProgress<string> UIEventHandler)
    {
        await Task.Run(() =>
        {
            // 24/7 running tasks. 
            // Sets a UIEventMessage to signal UI thread to do something.
            UIEventHandler.Report(UIEventMessage);
        });
    }

Это правильный способ обновления потока пользовательского интерфейса из длинного фонового потока?Тот факт, что мой обработчик событий datatype (IProgress) специально предназначен для отчетов о прогрессе, заставляет меня чувствовать, что я упускаю суть.

1 Ответ

0 голосов
/ 28 сентября 2018

Чтобы ввести данные из одного асинхронного потока в другой, вы должны вызвать его.

Определите в своем классе поле свойства:

    string _readData = null;

Затем заполните строку с помощью eventMessageи вызвать метод для вызова данных.

string eventMessage = e;
_readData = eventMessage;
Msg();

Это метод Msg ():

    private void Msg()
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new MethodInvoker(Msg));
        }
        else
        {
            textBox2.Text = textBox2.Text + Environment.NewLine + " >> " + _readData;
        }
    }
...