2014-05-15 7 views
5

Im Azure Service Bus-Warteschlangenclient verwende ich die Methode ReceiveBatchAsync, um eine bestimmte Zeit zu warten, bis ein Stapel von Nachrichten asynchron empfangen wird.Wie wird ein CancellationToken mit dem Azure Service Bus Queue-Client verwendet?

var messages = await queueClient.ReceiveBatchAsync(10, TimeSpan.FromSeconds(30)); 

würde ich eine saubere Abschaltung meiner Anwendung mag, so dass ich die Umsetzung CancellationToken auf all meinen langlaufende Asynchron Prozesse, aber es scheint nicht eine Überlastung von ReceiveBatchAsync zu sein, die kündbaren ist.

Mit anderen Worten, würde Ich mag, dies zu tun, aber ich kann nicht:

var messages = await queueClient.ReceiveBatchAsync(10, TimeSpan.FromSeconds(30), 
                 cancellationToken); 

Was wäre der beste Weg, um ein CancellationToken auf eine Aufgabe wie diese anzuwenden, die es nicht bieten direkt? Ich möchte nicht die gesamten 30 Sekunden während des Herunterfahrens warten.

Antwort

3

Sie könnten wahrscheinlich QueueClient.Abort wie folgt verwenden:

using (cancellationToken.Register(() => queueClient.Abort()) 
{ 
    var messages = await queueClient.ReceiveBatchAsync(
     10, TimeSpan.FromSeconds(30)); 
    return messages; // or process it 
} 
+0

Sehen auf der Oberfläche gut. Aber weißt du, ob es die Zeitüberschreitung tatsächlich unterbricht? Ich muss es versuchen und sehen. –

+0

@MattJohnson, ich weiß es nicht genau, da ich 'ReceiveBatchAsync' noch nicht verwendet habe. – Noseratio

+0

Wenn dies nicht der Fall ist, können Sie Ihr 'cancellationToken' immer mit einem Timeout' CancellationToken' über 'CancellationTokenSource' kombinieren, anstatt ein Timeout im Aufruf von' QueueClient.ReceiveBytesAsync' zu verwenden. –