ConfigureAwait (false) relevan di ASP.NET Core?

106

Saya tersandung pada masalah ( https://github.com/HTBox/allReady/issues/1313 ) di GitHub di mana mereka membahas tentang ConfigureAwait(false)mengeluarkan kode, mengklaim itu, di ASP.NET Core

panggilan ke ConfigureAwait(false)berlebihan dan tidak melakukan apa pun

Yang terbaik yang bisa saya temukan di sini adalah "catatan tambahan" dalam jawaban (dari Stephen Cleary, https://stackoverflow.com/a/40220190/2805831 ) yang mengatakan bahwa

ASP.NET Core tidak lagi memiliki "konteks"

Jadi, apakah ConfigureAwait(false)benar - benar tidak diperlukan di ASP.NET Core (meskipun menggunakan .Net Framework)? Apakah ada keuntungan nyata dalam kinerja dalam beberapa kasus atau perbedaan dalam hasil / semantik?

EDIT: Apakah berbeda dalam aspek ini jika saya menghostingnya sebagai aplikasi konsol atau di IIS?

Pedro Lorentz
sumber
2
Ini tergantung di mana Anda berencana menggunakannya. Jika Anda ingin menggunakannya secara langsung di aplikasi ASP.NET Core, Anda tidak perlu memanggilnya (Anda tidak harus memanggilnya di ASP.NET legacy maupun iirc). Tetapi jika Anda menulis perpustakaan, maka Anda harus selalu menggunakan ConfigureAwait(false), karena perpustakaan dapat digunakan oleh aplikasi yang berbeda (ASP.NET Core, WPF, UWP, Console dll.)
Tseng
1
ASP.NET Core berjalan sebagai aplikasi konsol secara default, dan aplikasi konsol AFAIK tidak memiliki SynchronizationContext, jadi ya, ini terdengar masuk akal untuk aplikasi ASP.NET Core default, bahkan dengan Framework lengkap.
Joe White
@JoeWhite Ok, pertanyaan sudah diedit. Apakah berbeda jika aplikasi ASP.NET Core saya ada di IIS?
Pedro Lorentz
3
Aplikasi ASP.NET Core yang berjalan di IIS masih berjalan sebagai aplikasi konsol - satu-satunya perbedaan adalah bahwa IIS memulai dan menutup instance aplikasi Anda (dengan cara yang sama ia akan mengelola instance dari proses pengerjaan ASP.NET di klasik ASP.NET). Itu tidak akan mengubah perilaku terkait utas di dalam aplikasi ASP.NET Anda. (Satu-satunya alasan saya ditentukan "secara default" adalah bahwa Anda bisa, misalnya, tuan rumah ASP.NET Inti di dalam aplikasi GUI, dan dalam hal ini Anda akan harus berpikir tentang konteks sinkronisasi.)
Joe Putih
Catatan ConfigureAwait(false), meskipun relevan dalam ASP.NET classic, sama sekali tidak diperlukan . Ini tradeoff: itu agak mengurangi beberapa kebuntuan sinkronisasi-over-async (yang merupakan kelemahan desain - mereka tidak ada kecuali seseorang melakukan sesuatu yang bodoh) dan kadang-kadang memiliki ~ peningkatan kinerja mikrodetik dengan tidak memuat ulang konteks. Dengan biaya tidak dapat bergantung pada konteks, dan memiliki ConfigureAwaitsemua melalui kode Anda. stackoverflow.com/questions/28221508/…
Dax Fohl

Jawaban:

113

ConfigureAwaithanya memiliki efek pada kode yang berjalan dalam konteks SynchronizationContextyang tidak dimiliki ASP.NET Core (ASP.NET "Legacy" tidak).

Kode tujuan umum tetap harus menggunakannya karena mungkin berjalan dengan file SynchronizationContext.

ASP.NET Core SynchronizationContext

Paulo Morgado
sumber
19
Hanya ingin memberikan sedikit klarifikasi, ASP.NET di lingkungan non inti memang memiliki konteks sinkronisasi, tetapi inti ASP.NET tidak.
Scott Chamberlain
@Morgado, apakah benar meskipun aplikasi dihosting di IIS?
Pedro Lorentz
7
Aplikasi ASP.NET Core tidak dihosting di IIS. IIS bertindak hanya sebagai proxy terbalik.
Paulo Morgado
2
Saya telah memperbarui jawabannya dengan posting terbaru dari Stephen Cleary. Tapi, ya, ASP.NET Core adalah ASP.NET Core.
Paulo Morgado
14
@Nam. Hargai ini adalah posting lama sekarang tetapi Stephen Cleary mengklarifikasi ini dalam salah satu pertanyaan di posting yang ditautkan oleh Paulo di atas. "Ini adalah kerangka kerja (ASP.NET Core sebagai lawan dari ASP.NET Classic) yang menentukan SynchronizationContext, bukan runtime (.NET Core sebagai lawan .NET 4.6.2)"
Gavin Sutherland
14

Bagaimana dengan ini?

Saat ini (Feb-2020) Pengembang di MS Blog merekomendasikan penggunaan ConfigureAwait (false) untuk Meningkatkan kinerja, Menghindari kebuntuan. https://devblogs.microsoft.com/dotnet/configureawait-faq/

Saya pernah mendengar ConfigureAwait (false) tidak lagi diperlukan di .NET Core. Benar? Salah. Diperlukan saat menjalankan .NET Core untuk alasan yang sama persis dengan yang diperlukan saat menjalankan .NET Framework. Tidak ada yang berubah dalam hal itu.

Alfred Severo
sumber
Jika beberapa kode pengguna (atau kode pustaka lain yang digunakan aplikasi Anda) menetapkan konteks khusus dan memanggil kode Anda, atau memanggil kode Anda dalam Tugas yang dijadwalkan ke TaskScheduler khusus, bahkan di ASP.NET Core, penantian Anda mungkin melihat non- konteks default atau penjadwal yang akan membuat Anda ingin menggunakan ConfigureAwait (false). Tentu saja, dalam situasi seperti itu, jika Anda menghindari pemblokiran sinkron (yang harus Anda hindari melakukannya di aplikasi web apa pun) dan jika Anda tidak keberatan dengan overhead kinerja kecil dalam kejadian terbatas seperti itu, Anda mungkin dapat lolos tanpa menggunakan ConfigureAwait (false) .
Alisson
2
Menurut saya, untuk kebanyakan kasus itu tidak diperlukan. Kecuali Anda menggunakan konteks sinkronisasi kustom atau menggunakan perpustakaan yang melakukannya.
Alisson