2017-02-08 5 views
0

Was ist die richtige Implementierung der SendAsync-Methode von Azure ServiceBus TopicClient?Azure ServiceBus TopicClient SendAsync-Implementierung in eigenem Wrapper

Wird in der zweiten Implementierung die BrokeredMessage tatsächlich vor dem SendAsync-Vorgang angeordnet?

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

Ich möchte am meisten von warten/asynchronen Muster bekommen.

+0

Nur neugierig: Warum möchten Sie nicht auf dasselbe wie SendAsync erwarten? – cassandrad

+0

@cassandrad Wenn Sie "erwarten" verwenden, heißt das eigentlich, dass Sie den Anruf "ausführen", nicht wahr? –

+0

Ja, die Ausführung startet sofort und blockiert nichts bevor Sie darauf warten. Gibt es irgendwelche Probleme damit? – cassandrad

Antwort

0

Antwort auf Ihre Frage: der zweite Ansatz könnte Probleme mit entsorgten Objekte verursachen, müssen Sie Ende der SendAsync Ausführung warten, bevor Sie Ressourcen freigeben können.

Detaillierte Erklärung.

Wenn Sie await aufrufen, wird die Ausführung einer Methode im selben Moment gestoppt und nicht fortgesetzt, bis die gewünschte Methode nicht zurückgegeben wird. Die vermittelte Nachricht wird in einer lokalen versteckten Variablen gespeichert und nicht entsorgt.

Wenn Sie nicht await aufrufe, wird die Ausführung fortsetzen und alle Ressourcen der vermittelten Nachricht werden befreit werden, bevor sie tatsächlich verbraucht werden oder in dem Prozess des Verbrauchs (wie using wird Dispose auf Objekt am Ende Aufruf). Dies führt definitiv zu Ausnahmen innerhalb SendAsync. Zu diesem Zeitpunkt wird die Ausführung von SendAsynctatsächlich gestartet.

Was await tut ist "pausiert" jeden aktuellen Thread und wartet auf Abschluss der Aufgabe und es ist das Ergebnis. Und das brauchst du wirklich. Zweck von async-await ist es, die Ausführung einer Aufgabe gleichzeitig mit etwas anderem zu erlauben, es bietet die Möglichkeit, auf ein Ergebnis der gleichzeitigen Operation zu warten, wenn es wirklich notwendig ist und eine weitere Ausführung ohne sie nicht möglich ist.

Der erste Ansatz ist gut, wenn jede Methode nach oben auch eine asynchrone Methode ist. Ich meine, wenn der Aufrufer von Ihrem SendAsync Async-Task ist, und der Aufrufer dieses Aufrufers und so weiter an die oberste Aufrufmethode.

Beachten Sie auch Ausnahmen, die sich erhöhen könnten, sie sind aufgeführt here. Wie Sie sehen können, gibt es sogenannte transiente Fehler. Dies ist eine Art von Fehlern, die durch einen erneuten Versuch behoben werden können. In Ihrem Code gibt es keine solche Ausnahmebehandlung. Beispiel für ein Wiederholungsmuster könnte gefunden werden here, aber der erwähnte Artikel über Ausnahmen kann bessere Lösungen vorschlagen und es ist ein Thema einer anderen Frage. Ich würde auch ein Logging-System hinzufügen, um zumindest über nicht-flüchtige Ausnahmen informiert zu sein.

+0

Das habe ich mir gedacht. Ich musste es einfach überprüfen. Also, um es auf den Punkt zu bringen: Der erste Ansatz ist der beste Ansatz, während die anderen Threads ihre Aufgabe erfüllen können, während sie auf das "SendAsync" warten. Richtig? –

+0

Im Allgemeinen - ja. Es wurden weitere Details zu möglichen Ausnahmen hinzugefügt, die wichtig sein könnten. – cassandrad

+0

Vielen Dank, sehr hilfreich. es ist mir jetzt klar. –

Verwandte Themen