2017-02-08 15 views
0

Azure ServiceBus TopicClient의 SendAsync 메소드가 제대로 구현 되었습니까?Azure ServiceBus TopicClient 자신의 래퍼에서 SendAsync 구현

두 번째 구현에서 실제로 SendAsync가 발생하기 전에 BrokeredMessage가 삭제됩니까?

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); 
     } 
    } 

나는 await/async 패턴을 최대한 활용하고 싶습니다.

+0

그냥 궁금해서 SendAsync와 같은 것을 사용하지 않으려는 이유는 무엇입니까? – cassandrad

+0

@cassandrad 만약 당신이 기다리는 것을 사용한다면 실제로 당신이 통화를 "수행 중"이라는 것을 의미합니까? 그렇습니다. –

+0

예, 실행이 즉시 시작되고 기다리기 전에 실행이 차단되지 않습니다. 거기에 어떤 문제가 있습니까? – cassandrad

답변

0

질문에 대답 : 두 번째 방법은 폐기 된 개체에 문제가 발생할 수 있으므로 리소스를 해제하기 전에 SendAsync 실행이 끝날 때까지 기다려야합니다.

자세한 설명입니다.

await으로 전화를 걸면 동시에 메서드 실행이 중지되고 대기 메서드가 반환되지 않을 때까지 계속되지 않습니다. 중재 된 메시지는 로컬 숨김 변수에 저장되며 처리되지 않습니다. 또는 소비의 과정에서 (using 마지막에 개체에 Dispose를 호출로)

당신이 await를 호출하지 않는 경우, 실행은 계속하고 실제로 소비되기 전에 중개 메시지의 모든 리소스가 해제됩니다. 이것은 확실히 SendAsync 안에 예외로 이어질 것입니다. 이 시점에서 SendAsync의 실행은 실제로에서 시작됩니다.

어떤 await이 현재 스레드를 "일시 중지"하고 있으며 작업 완료를 기다리고 그 결과입니다. 그리고 그것이 실제로 필요한 것입니다. async-await의 목적은 다른 작업과 동시에 작업을 수행 할 수 있도록 허용하는 것이며, 실제로 필요한 경우 동시 작업 결과를 기다리는 기능을 제공하며 추가 작업 없이는 실행할 수 없습니다.

상단의 모든 메소드가 비동기 메소드이기도 한 경우 첫 번째 방법이 좋습니다. 제 말은 SendAsync의 호출자가 비동기 작업이고 해당 호출자의 호출자 등이 최상위 호출 메소드입니다.

또한 제기 할 수있는 예외는 고려해 보면 here입니다. 보시다시피, 이른바 일시적인 오류가 있습니다. 이것은 재 시도가 해결할 수있는 종류의 오류입니다. 귀하의 코드에는 예외 처리가 없습니다. 재시도 패턴의 예는 here이지만 예외에 대한 언급 된 기사는 더 나은 해결책을 제시 할 수 있으며 다른 질문의 주제입니다. 적어도 일시적인 예외를 인식 할 수있는 로깅 시스템도 추가 할 것입니다.

+0

그게 내가 생각한거야. 방금 다시 확인해야했습니다. 그래서, 그것을 감싸는 것 : 첫 번째 접근 방식은 다른 스레드가 자신의 일을 할 수있는 "SendAsync"를 "기다리는 동안"가장 좋은 접근 방식입니다. 옳은? –

+0

일반적으로 - 예. 중요 할 수있는 예외에 대한 자세한 내용을 추가했습니다. – cassandrad

+0

고맙습니다. 매우 도움이됩니다. 이제는 나에게 분명하다. –