Правильный способ обработки события в основном потокеC#

Место общения программистов C#
Гость
Правильный способ обработки события в основном потоке

Сообщение Гость »

Обычно, когда я хочу обработать событие в основном потоке, которое было вызвано в фоновом потоке, я пишу следующее:

Код: Выделить всё

_backgroundWork.BackgroundEvent += (sender, args) => DoSomethingForUI();

private void DoSomethingForUI()
{
Application.Current.Dispatcher.Invoke(new Action(() => { /* Something for UI */ }));
}
Однако при использовании Microsoft.VisualStudio.Threading.Analyzers я получаю предупреждение о том, что Invoke — это устаревший метод переключения потоков, и мне следует сделать следующее:

Код: Выделить всё

_backgroundWork.BackgroundEvent += (sender, args) => DoSomethingForUI();

private async void DoSomethingForUI()
{
await _joinableTaskFactory.SwitchToMainThreadAsync();
/* Do something for UI */
}
Это избавит от предупреждения, но выдаст новое предупреждение о том, что мне не следует использовать async void, а вместо этого следует использовать следующее:

Код: Выделить всё

_backgroundWork.BackgroundEvent += (sender, args) => DoSomethingForUI();

private void DoSomethingForUI()
{
_joinableTaskFactory.RunAsync(async () =>
{
await _joinableTaskFactory.SwitchToMainThreadAsync();
/* Do something for UI */
});
}
Опять же, это избавляет от предупреждения, но выдает еще одно предупреждение. Я избавился от этого предупреждения, выполнив следующие действия:

Код: Выделить всё

_backgroundWork.BackgroundEvent += (sender, args) => DoSomethingForUI();

private void DoSomethingForUI()
{
_joinableTaskFactory.Run(async () =>
{
await _joinableTaskFactory.SwitchToMainThreadAsync();
/* Do something for UI */
});
}
Это выдает еще одно предупреждение, однако одно звучит не так плохо, как другие.
Я все еще в замешательстве. Как правильно обрабатывать фоновое событие в основном потоке?

Подробнее здесь: https://stackoverflow.com/questions/781 ... ain-thread

Вернуться в «C#»