2017-02-08 20 views
0

Какова правильная реализация метода SendAsync для Azure ServiceBus TopicClient?Azure ServiceBus TopicClient SendAsync реализация в собственной обертке

Во второй реализации будет ли BrokeredMessage фактически удаляться до того, как произойдет SendAsync?

public async Task SendAsync<TMessage>(TMessage message, IDictionary<string, object> properties = null) 
    { 
     using (var bm = MessagingHelper.CreateBrokeredMessage(message, properties)) 
     { 
      await this._topicClient.Value.SendAsync(bm); 
     } 
    } 


    public Task SendAsync<TMessage>(TMessage message, IDictionary<string, object> properties = null) 
    { 
     using (var bm = MessagingHelper.CreateBrokeredMessage(message, properties)) 
     { 
      return this._topicClient.Value.SendAsync(bm); 
     } 
    } 

Я хотел бы получить от ожидающего/асинхронного образца.

+0

Просто любопытно: почему вы не хотите использовать ожидание на том же, что и SendAsync? – cassandrad

+0

@cassandrad Если вы используете ожидание, это на самом деле означает, что вы выполняете вызов, не так ли? –

+0

Да, выполнение начнется немедленно и ничего не заблокирует, прежде чем ждать. Есть ли проблемы с этим? – cassandrad

ответ

0

На ваш вопрос: второй подход может вызвать проблемы с расположенными объектами, вам нужно подождать окончания SendAsync исполнения, прежде чем вы сможете освободить ресурсы.

Подробное объяснение.

Если вы вызываете await, выполнение метода будет остановлено в тот же момент и не будет продолжаться до тех пор, пока ожидаемый метод не будет возвращен. Брокерское сообщение будет храниться в локальной скрытой переменной и не будет удалено.

Если вы не вызываете await, выполнение продолжится и все ресурсы при посредничестве сообщения будут освобождены, прежде чем они на самом деле потребляется (как using звонит Dispose на объекте в конце) или в процессе потребления. Это определенно приведет к исключениям внутри SendAsync. На этом этапе выполняется фактически SendAsync.

Что делает await, является «приостановкой» любой текущей темы и ждет завершения задачи, и это результат. И это то, что вам действительно нужно. Цель async-await - разрешить выполнение некоторой задачи одновременно с чем-то другим, она обеспечивает возможность ждать результата параллельной операции, когда это действительно необходимо, и дальнейшее выполнение без нее невозможно.

Первый подход хорош, если каждый метод в верхней части также является асинхронным методом. Я имею в виду, если вызывающим агентом SendAsync является async Task, а вызывающий абонент и т. Д. - к методу верхнего вызова.

Также рассмотрите исключения, которые могут поднять, они перечислены here. Как вы можете видеть, существуют так называемые временные ошибки. Это своего рода ошибки, которые могут потребовать повторные попытки. В вашем коде нет такой обработки исключений. Пример шаблона повтора можно найти here, но упомянутая статья об исключениях может предложить лучшие решения, и это тема другого вопроса. Я бы также добавил некоторую систему ведения журнала, чтобы, по крайней мере, знать о любых непереходных исключениях.

+0

Вот что я подумал. Мне просто нужно было дважды проверить это. Итак, чтобы его обернуть: первый подход - лучший подход, так как в ожидании «SendAsync» другие потоки могут выполнять свою работу. Верный? –

+0

В общем - да. Добавлена ​​дополнительная информация о возможных исключениях, которые могут быть важны. – cassandrad

+0

Спасибо, очень полезно. мне теперь ясно. –

 Смежные вопросы

  • Нет связанных вопросов^_^