Почему метод должен быть асинхронной задачей для отлова исключений - PullRequest
0 голосов
/ 18 марта 2019

У меня есть метод, который я хочу запустить асинхронно:

public async Task Send(MemoryMapModel memoryMap, SerialPort serialPort, ProgressBar progressBar, Settings settings)
{
    SendFrames(memoryMap, serialPort, progressBar, _token.Token, settings);
}

И я использую его следующим образом: Task.Run ():

await Task.Run(async () => await _rtuLogic.Send(memoryMap, serialPort, pbProgressBar, settings).ConfigureAwait(false));

Метод " Send " генерирует исключения, которые я хочу перехватить, но для этого необходимо выполнить асинхронную задачу, но нет ожидаемых методов и VS хочет, чтобы я не использовал ключевое слово async .

Почему я не могу перехватить исключения из Task.Run(() => void), но это работает для Task.Run(async () => async Task), хотя нет подходящих методов?

РЕДАКТИРОВАТЬ: Кроме того, когда я пытался

Task.Factory.StartNew(() => { _rtuLogic.SendAsync(memoryMap, serialPort, pbProgressBar, settings); });

я не могу перехватить и обработать исключения.Если я не использую Task.Run (...) Send не работает асинхронно и останавливает графический интерфейс.

1 Ответ

1 голос
/ 18 марта 2019

Некоторые люди могут считать его немного устаревшим, теперь у нас есть async, но вы, кажется, добавляете async / await повсюду и надеетесь, что это решит вашу проблему. 1

Так что я бы предложил отказаться от этой попытки и взглянуть на использование BackgroundWorker.Это позволяет вам четко отделить биты, которые должны происходить «в другом месте», от битов, которые все еще необходимы для доступа к пользовательскому интерфейсу, и поможет избежать его блокировки.

Task.Run обычно следует избегать, если вы не работали с привязкой к ЦП, чтоВы хотите удалить текущий поток.

Если вы действительно хотите перейти на async / await, то в идеале вы найдете асинхронный вариант SendFrames и используете его вместо этого.Но если это еще не доступно / не написано, не пытайтесь притвориться , что оно асинхронно.


1 Теперь удаленный ответ связан с этот ответ Стивена Клири , который, в свою очередь, ссылается на другие статьи / посты об асинхронности, которые я бы посоветовал вам попытаться подготовить для всех и других постов блога Стивена Клири ( Нет темы всегда рекомендуется читать)

...