Güncelleştirme: ASP.NET Core'da birSynchronizationContext
. ASP.NET Core kullanıyorsanız, kullanıp kullanmamanız önemli ConfigureAwait(false)
değildir.
ASP.NET "Tam" veya "Klasik" veya her neyse, bu yanıtın geri kalanı hala geçerlidir.
Orijinal gönderi (Core olmayan ASP.NET için):
ASP.NET ekibinin bu videosu, ASP.NET'te kullanma hakkında en iyi bilgiye sahiptir async
.
İplik bağlamlarını orijinal iplik bağlamına geri döndürmek zorunda olmadığından daha performanslı olduğunu okumuştum.
Bu, "senkronize etmeniz" gereken tek bir UI iş parçacığının bulunduğu UI uygulamaları için geçerlidir.
ASP.NET'te durum biraz daha karmaşıktır. Bir async
yöntem yürütmeyi sürdürdüğünde, ASP.NET iş parçacığı havuzundan bir iş parçacığı alır. Bağlam yakalamayı kullanarak devre dışı bırakırsanız ConfigureAwait(false)
, iş parçacığı yalnızca yöntemi doğrudan yürütmeye devam eder. Bağlam yakalamayı devre dışı bırakmazsanız, iş parçacığı istek bağlamını yeniden girer ve sonra yöntemi yürütmeye devam eder.
Yani ConfigureAwait(false)
size ASP.NET bir iş parçacığı atlama kaydetmez; istek içeriğinin yeniden girilmesini önler, ancak bu normalde çok hızlıdır. ConfigureAwait(false)
olabilir Eğer bir istek paralel işlem küçük bir miktar yapmaya çalışıyoruz, ama gerçekten TPL bu senaryoların çoğu için daha uygun olup olmadığını yararlı olabilir.
Ancak, ASP.NET Web Api ile, isteğiniz bir iş parçacığında geliyorsa ve ApiController işlevinizin son sonucunu döndürürken potansiyel olarak farklı bir iş parçacığına neden olabilecek ConfigureAwait (false) işlevini çağırırsanız .
Aslında, sadece bir await
kutu yapmak bunu yapabilir. Senin kez async
yöntem vurur await
, yöntem ama engellenir parçacığı iplik havuzuna geri döner. Yöntem devam etmeye hazır olduğunda, herhangi bir evre iş parçacığı havuzundan kapar ve yöntemi sürdürmek için kullanılır.
ConfigureAwait
ASP.NET'te yapılan tek fark , iş parçacığının yöntemi devam ettirirken istek bağlamına girip girmeyeceğidir.
MSDN makalemdeSynchronizationContext
ve async
giriş blog yayınımda daha fazla arka plan bilgisi var .
HttpContext.Current
,SynchronizationContext
varsayılan olarak siz tarafından akan ASP.NET tarafından akarawait
, ancak akmazContinueWith
. Otoh, (güvenlik kısıtlamaları dahil) Yürütme içeriği C # yoluyla CLR belirtilen bağlam olduğunu ve olan her ikisi tarafından aktıContinueWith
veawait
(eğer kullansanız bileConfigureAwait(false)
).