Правильный способ обработки события в основном потоке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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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