Я пытался определить правильный подход к манипулированию пользовательским интерфейсом из асинхронной задачи.Мое приложение забито многопоточными вызовами и начальными вызовами.Я пытаюсь смягчить этот беспорядок, а также обеспечить немного большую отзывчивость пользовательского интерфейса, используя 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) специально предназначен для отчетов о прогрессе, заставляет меня чувствовать, что я упускаю суть.