2013-05-15 9 views
76

döndüren ve IDisposable örneğini döndüren bir yöntem çağrısı yaptığım bir durum var. Örneğin: async olay yerindeydi önce IDisposable örneği ile çalışırken İfadeleri kullanarak ve anahtar kelimeler c güzel bir şekilde oynuyor C#

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

Şimdi, "yanıt" değişkeni kullanılan bu çağrı ve kod using ifadesinde sarılmış olacaktır.

Sorum, async anahtar sözcüğünün karışıma atıldığında hala doğru bir yaklaşım olup olmadığı sorusu mu? Kod derlenmiş olsa da, aşağıdaki örnekte de kullanım bildirimi 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; 
} 

cevap

77

Evet, bu ince olmalıdır. İlk durumda

, gerçekten söylüyorsun: Biz
  • kullanın ve ikinci durumda derhal bunun
  • elden yanıt almak kadar

    • uyumsuz bekleyin diyorsunuz:

      • Eşzamansız yanıt alamadığımıza kadar bekleyin
      • Biz tepki yanıtının
      • bertaraf giriş yaptıktan kadar
      • uyumsuz bekleyin

      bir zaman uyumsuz yönteminde bir using açıklamada Dispose çağrı birine farklı bir iş parçacığı içinde yürütebilir ki "garip" olan kaynağı (senkronizasyon içeriğine bağlı olarak) elde etmiş olsanız da, yine de ... 'un için beklediğiniz şeyi varsaymanız veya başarısız olmanızın farz edeceği varsayılmaktadır. (Sadece size using deyimi döndürür asla bir yönteme bir çağrı içeriyorsa zaman uyumsuz olmayan kodunda Dispose arayarak sona ermeyecek gibi.)

    +3

    Teşekkür Jon. Async şeylerin çoğu hala bana voodoo olsa da, diğer .net özellikleri ve sadece çalışır ile ne sıklıkla entegre olduğunu görmek için oldukça güven verici – swingdoctor

    İlgili konular