İfadeleri kullanın ve anahtar kelimelerin c # 'da güzelce oynamasını bekleyin


102

asyncDönen ve IDisposableörnek veren bir yönteme çağrı yaptığım bir durum var . Örneğin:

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

Şimdi daha önce asyncolay yerindeyken, bir IDisposableörnekle çalışırken , "response" değişkenini kullanan bu çağrı ve kod bir using ifadesine sarılırdı.

Sorum, asyncanahtar kelime karışıma atıldığında bunun hala doğru yaklaşım olup olmadığı ? Kod derlese bile, using ifadesi aşağıdaki her iki örnekte de beklendiği gibi çalışacak mı?

örnek 1

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

    return true;
}

Örnek 2

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

    return true;
}

Yanıtlar:


98

Evet, bu iyi olmalı.

İlk durumda, gerçekten diyorsun:

  • Yanıtı alana kadar eşzamansız olarak bekleyin
  • Kullanın ve hemen atın

İkinci durumda diyorsun ki:

  • Yanıtı alana kadar eşzamansız olarak bekleyin
  • Yanıtı günlüğe kaydedene kadar eşzamansız olarak bekleyin
  • Yanıtı atın

Bir usingEş zamansız yönteminde Açıklamada, "odd" dir Dispose(vb senkronizasyon bağlama bağlı) çağrısı kaynak edinilmiş biri farklı dizisindeki yürütebilir ama yine de ne olacak ... şey senin içindi bekleyen varsayarak elbette hiç ortaya çıkmaz veya başarısız olur. ( Disposeİfadeniz usingasla geri dönmeyen bir yönteme çağrı içeriyorsa , eşzamansız olmayan kodda arama yapmayı bırakmayacağınız gibi.)


4
Teşekkürler Jon. Eşzamansız şeylerin çoğu benim için hala vudu olsa da, diğer .net özellikleriyle ne sıklıkla bütünleştiğini ve işe yaradığını görmek oldukça güven verici
swingdoctor

@JonSkeet Bir using(){...}blok içinde bile kullanılmayı beklemeli mi yoksa aşırı bir durum mu yoksa bazı durumlarda performansı düşürebilir mi? İle using(){...}aynı amaca hizmet ediyor mu await?
nam

1
@nam: Hayır usingve awaittamamen farklı amaçlara hizmet eder. C # 8'in artık eşzamansız imha da olduğunu unutmayın. 'S değerinde cevabım vurgular parçacığı sorunun farkında olma ederken, bu kesinlikle öyle anlamına gelmez yanlış karıştırmak usingve await.
Jon Skeet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.