На ваш вопрос: второй подход может вызвать проблемы с расположенными объектами, вам нужно подождать окончания SendAsync
исполнения, прежде чем вы сможете освободить ресурсы.
Подробное объяснение.
Если вы вызываете await
, выполнение метода будет остановлено в тот же момент и не будет продолжаться до тех пор, пока ожидаемый метод не будет возвращен. Брокерское сообщение будет храниться в локальной скрытой переменной и не будет удалено.
Если вы не вызываете await
, выполнение продолжится и все ресурсы при посредничестве сообщения будут освобождены, прежде чем они на самом деле потребляется (как using
звонит Dispose
на объекте в конце) или в процессе потребления. Это определенно приведет к исключениям внутри SendAsync
. На этом этапе выполняется фактически SendAsync
.
Что делает await
, является «приостановкой» любой текущей темы и ждет завершения задачи, и это результат. И это то, что вам действительно нужно. Цель async-await
- разрешить выполнение некоторой задачи одновременно с чем-то другим, она обеспечивает возможность ждать результата параллельной операции, когда это действительно необходимо, и дальнейшее выполнение без нее невозможно.
Первый подход хорош, если каждый метод в верхней части также является асинхронным методом. Я имею в виду, если вызывающим агентом SendAsync является async Task, а вызывающий абонент и т. Д. - к методу верхнего вызова.
Также рассмотрите исключения, которые могут поднять, они перечислены here. Как вы можете видеть, существуют так называемые временные ошибки. Это своего рода ошибки, которые могут потребовать повторные попытки. В вашем коде нет такой обработки исключений. Пример шаблона повтора можно найти here, но упомянутая статья об исключениях может предложить лучшие решения, и это тема другого вопроса. Я бы также добавил некоторую систему ведения журнала, чтобы, по крайней мере, знать о любых непереходных исключениях.
Просто любопытно: почему вы не хотите использовать ожидание на том же, что и SendAsync? – cassandrad
@cassandrad Если вы используете ожидание, это на самом деле означает, что вы выполняете вызов, не так ли? –
Да, выполнение начнется немедленно и ничего не заблокирует, прежде чем ждать. Есть ли проблемы с этим? – cassandrad