ConfigureAwait (false) ASP.NET Core ile ilgili mi?


106

GitHub'da bir sorunla karşılaştım ( https://github.com/HTBox/allReady/issues/1313 ), ASP.NET Core'daConfigureAwait(false) bunu iddia ederek koddan çıkarmayı tartıştıkları yerde

için yapılan çağrı ConfigureAwait(false)gereksizdir ve hiçbir şey yapmaz

Burada bulabildiğim en iyi şey, bir yanıtta (Stephen Cleary'den, https://stackoverflow.com/a/40220190/2805831 ) şunu söyleyen bir "yan not"

ASP.NET Core artık bir "bağlam" içermez

Öyleyse, ASP.NET Core'daConfigureAwait(false) gerçekten gereksiz mi (tam .Net Framework kullanıyor olsa bile)? Bazı durumlarda performansta gerçek bir kazanç veya sonuçta / anlambilimde farklılık var mı?

DÜZENLEME: Bir konsol uygulaması olarak mı yoksa IIS'de mi barındırıyorsam bu açıdan farklı mı?


2
Bu, onu nerede kullanmayı planladığınıza bağlıdır. Doğrudan ASP.NET Core uygulamanızda kullanmak istiyorsanız, o zaman onu aramanıza gerek yoktur (ne ASP.NET mirasında ne de iirc olarak çağırmanız gerekmez). Ancak bir kitaplık yazarsanız ConfigureAwait(false), kitaplık farklı uygulamalar (ASP.NET Core, WPF, UWP, Console vb.) Tarafından tüketilebileceği için her zaman kullanmalısınız
Tseng

1
ASP.NET Core varsayılan olarak bir konsol uygulaması olarak çalışır ve AFAIK konsol uygulamalarının bir SynchronizationContext yoktur, bu nedenle evet, bu, tam Çerçeve ile bile varsayılan bir ASP.NET Core uygulaması için mantıklı geliyor.
Joe White

@JoeWhite Ok, soruyu düzenledi. ASP.NET Core uygulamam IIS'de ise farklı mıdır?
Pedro Lorentz

3
IIS'de çalışan bir ASP.NET Core uygulaması hala bir konsol uygulaması olarak çalışır - tek fark, IIS'nin uygulamanızın örneklerini başlatması ve kapatmasıdır (aynı şekilde ASP.NET çalışan işleminin yönetilen örneklerini içinde klasik ASP.NET). ASP.NET uygulamanızdaki iş parçacığı ile ilgili herhangi bir davranışı değiştirmez. (I "varsayılan olarak" Belirtilen tek nedeni, örneğin, ev sahibi ASP.NET Çekirdek bir GUI uygulaması açıkken ve bu durumda olabilir olduğunu ediyorum senkronizasyon bağlamda düşünmek zorundayız.)
Joe Beyaz

Unutmayın ConfigureAwait(false), ASP.NET classic ile alakalı olsa da, hiçbir şekilde gerekli değildir . Bu bir değiş tokuş: bazı eşzamanlı eşzamansız kilitlenmeleri hafifletiyor (ki bunlar tasarım kusurlarıdır - birisi aptalca bir şey yapmadıkça var olmazlar) ve bazen bağlamı yeniden yüklemeyerek ~ mikrosaniye performans artışı sağlar. Bağlama bağlı olamama ve ConfigureAwaitkodunuz aracılığıyla her şeye sahip olma pahasına . stackoverflow.com/questions/28221508/…
Dax Fohl

Yanıtlar:


113

ConfigureAwaityalnızca SynchronizationContextASP.NET Core'un sahip olmadığı bağlamda çalışan kod üzerinde etkileri vardır (ASP.NET "Eski" yapar).

Genel amaçlı kod yine de onu kullanmalıdır çünkü bir SynchronizationContext.

ASP.NET Core SynchronizationContext


18
Küçük bir açıklama yapmak gerekirse, çekirdek olmayan bir ortamda ASP.NET'in bir eşitleme bağlamı vardır, ancak ASP.NET çekirdeği yoktur.
Scott Chamberlain

@Morgado, uygulama IIS'de barındırılsa bile doğru mu?
Pedro Lorentz

7
Bir ASP.NET Core uygulaması IIS'de barındırılmaz. IIS, ters bir proxy gibi davranıyor.
Paulo Morgado

2
Yanıtı Stephen Cleary'den yeni bir gönderiyle güncelledim. Ama evet, ASP.NET Core, ASP.NET Core'dur.
Paulo Morgado

14
@NamNgo. Bunun artık eski bir gönderi olduğunu takdir edin, ancak Stephen Cleary bunu Paulo'nun yukarıda bağlantı verdiği gönderideki sorulardan birinde açıklıyor . "SynchronizationContext'i belirleyen çerçevedir (ASP.NET Classic'in aksine ASP.NET Core), çalışma zamanını değil (.NET 4.6.2'nin aksine .NET Core)"
Gavin Sutherland

14

Peki buna ne dersin?

Şu anda (Şubat-2020) MS Blog'daki geliştiriciler, performansı iyileştirmek, kilitlenmelerden kaçınmak için ConfigureAwait (false) kullanılmasını önermektedir. https://devblogs.microsoft.com/dotnet/configureawait-faq/

.NET Core'da ConfigureAwait'in (false) artık gerekli olmadığını duydum. Doğru? Yanlış. NET Framework üzerinde çalışırken ihtiyaç duyulan aynı nedenlerle .NET Core üzerinde çalışırken gereklidir. Bu konuda hiçbir şey değişmedi.


Bazı kullanıcı kodu (veya uygulamanızın kullandığı başka bir kitaplık kodu) özel bir bağlam ayarlarsa ve kodunuzu çağırırsa veya özel bir TaskScheduler'a zamanlanmış bir Görevdeki kodunuzu çağırırsa, ASP.NET Core'da bile beklediğinizde ConfigureAwait (false) kullanmak istemenize neden olacak varsayılan bağlam veya zamanlayıcı. Elbette, bu tür durumlarda, eşzamanlı olarak engellemekten kaçınırsanız (bunu web uygulamalarında yapmaktan kaçınmanız gerekir) ve bu tür sınırlı olaylarda küçük performans ek yüklerine aldırmazsanız, muhtemelen ConfigureAwait'i kullanmadan kurtulabilirsiniz (yanlış) .
Alisson

2
Buna göre, çoğu durumda buna gerek olmadığını söyleyebilirim. Özel bir senkronizasyon bağlamı kullanmadığınız veya bunu yapan bir kitaplık kullanmadığınız sürece.
Alisson
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.