this excellent one here dahil olmak üzere çok sayıda kitap ve bloglara dayanarak, kişinin yardımcı async yöntemlerini, yani sarmalayıcı yöntemlerini açığa çıkaran bir dll kütüphanesi yazdığında, bunun genellikle dahili olarak en iyi uygulama olduğu düşünülür. bir threadpool iplik gerçek zaman uyumsuz yöntem I/o görevi tamamlamak gibi pek (sözde kod kısalık için aşağıda gösterilen ve bir örnek olarak HttpClient
kullanıyorum)C# ConfigureAwait (false) ile asenkronizasyon/zincir oluşturma
public Async Task<HttpResponseMessage> MyMethodAsync(..)
{
...
var httpClient = new HttpClient(..);
var response = await httpClient.PostAsJsonAsync(..).ConfigureAwait(false);
...
return response;
}
burada anahtar, böylece ConfigureAwait(false)
kullanımıdır IO görev tamamlama, orijinal iş parçacığı bağlamı yerine bir iş parçacığı iş parçacığı üzerinde gerçekleşir, dolayısıyla kilitlenme olasılığını önler.
Sorumu arayan kişinin bakış açısından. Aşağıdaki örnekte görüldüğü gibi, arayan ve yukarıdaki yöntem çağrısı arasında yöntem çağrıları katmanlarının olduğu bir senaryo ile özellikle ilgileniyorum.
CallerA -> Method1Async -> Method2Async -> finally the above MyMethodAsync
yeterince sadece nihai yöntemi ConfigureAwait(false)
olması veya bir zamanda Method1Async
sağlamalıdır ve Method2Async
ayrıca yurt ConfigureAwait(false)
ile zaman uyumsuz yöntemleri çağırmak bunu midir? Tüm bu aracı yöntemlere dahil edilmesi, özellikle de Method1Async
ve Method2Async
'un MyMethodAsync
numaralı çağrıya son veren aşırı yüklenmeler olması saçma gibi görünüyor. Herhangi bir düşünce, lütfen bizi aydınlatın! Aşağıdaki özel zaman uyumsuz yöntemi ile bir kütüphane var Yani eğer
private async Task<string> MyPrivateMethodAsync(MyClass myClass)
{
...
return await SomeObject.ReadAsStringAsync().ConfigureAwait(false);
}
Ben aşağıda gösterildiği gibi aşağıdaki kamu aşırı yöntemler hem de (yanlış) ConfigureAwait de emin olmalısınız, Örnek ile güncellendi?
public async Task<string> MyMethodAsync(string from)
{
return await MyPrivateMethodAsync(new (MyClass() { From = from, To = "someDefaultValue"}).ConfigureAwait(false);
}
public async Task<string> MyMethodAsync(string from, string to)
{
return await MyPrivateMethodAsync(new (MyClass() { From = from, To = to }).ConfigureAwait(false);
}
'ConfigureAwait (false)' kütüphane kodu için iyi bir uygulama olsa da, kullanımının kendi anlamları olabilir: http://stackoverflow.com/q/28410046 – Noseratio