it-swarm.com.de

Verwenden Sie Anweisungen und warten Sie auf Schlüsselwörter.

Ich habe eine Situation, in der ich einen async -Aufruf für eine zurückgegebene Methode und eine IDisposable -Instanz vornehme. Beispielsweise:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

Bevor async in der Szene war, wurden bei der Arbeit mit einer IDisposable -Instanz dieser Aufruf und der Code, der die Variable "response" verwendete, in eine using-Anweisung eingeschlossen.

Meine Frage ist, ob das noch der richtige Ansatz ist, wenn das Schlüsselwort async in die Mischung geworfen wird? Funktioniert die using-Anweisung auch dann, wenn der Code kompiliert wird, wie in den beiden folgenden Beispielen erwartet?

Beispiel 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

Beispiel 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}
91
swingdoctor

Ja, das sollte in Ordnung sein.

Im ersten Fall sagen Sie wirklich:

  • Warten Sie asynchron, bis wir die Antwort erhalten
  • Verwenden Sie es und entsorgen Sie es sofort

Im zweiten Fall sagen Sie:

  • Warten Sie asynchron, bis wir die Antwort erhalten
  • Warten Sie asynchron, bis die Antwort protokolliert wurde
  • Entsorgen Sie die Antwort

Eine using -Anweisung in einer asynchronen Methode ist insofern "ungerade", als der Dispose -Aufruf in einem anderen Thread ausgeführt werden kann als der, der die Ressource erworben hat (abhängig vom Synchronisationskontext usw.) passieren ... unter der Annahme, dass das, worauf Sie warten jemals auftaucht oder scheitert, natürlich. (So ​​wie Sie Dispose nicht in nicht asynchronem Code aufrufen, wenn Ihre using -Anweisung einen Aufruf einer Methode enthält, die niemals zurückgibt.)

91
Jon Skeet