Pembaruan: ASP.NET Core tidak memilikiSynchronizationContext
. Jika Anda menggunakan ASP.NET Core, tidak masalah apakah Anda menggunakan ConfigureAwait(false)
atau tidak.
Untuk ASP.NET "Penuh" atau "Klasik" atau apa pun, sisa jawaban ini masih berlaku.
Posting asli (untuk ASP.NET non-Core):
Video ini oleh tim ASP.NET memiliki informasi terbaik tentang penggunaan async
di ASP.NET.
Saya telah membaca bahwa itu lebih berkinerja karena tidak harus mengubah konteks utas kembali ke konteks utas asli.
Ini berlaku untuk aplikasi UI, di mana hanya ada satu utas UI yang harus "disinkronkan" kembali.
Di ASP.NET, situasinya sedikit lebih kompleks. Ketika suatu async
metode melanjutkan eksekusi, itu mengambil sebuah utas dari kumpulan utas ASP.NET. Jika Anda menonaktifkan pengambilan konteks menggunakan ConfigureAwait(false)
, maka utas hanya melanjutkan menjalankan metode secara langsung. Jika Anda tidak menonaktifkan tangkapan konteks, maka utas akan memasukkan kembali konteks permintaan dan kemudian melanjutkan untuk mengeksekusi metode.
Jadi ConfigureAwait(false)
tidak menghemat lompatan thread di ASP.NET; itu tidak menyelamatkan Anda memasukkan kembali konteks permintaan, tetapi ini biasanya sangat cepat. ConfigureAwait(false)
bisa berguna jika Anda mencoba melakukan sejumlah kecil pemrosesan paralel permintaan, tetapi sebenarnya TPL lebih cocok untuk sebagian besar skenario tersebut.
Namun, dengan ASP.NET Web Api, jika permintaan Anda masuk dalam satu utas, dan Anda menunggu beberapa fungsi dan memanggil ConfigureAwait (false) yang berpotensi menempatkan Anda pada utas yang berbeda ketika Anda mengembalikan hasil akhir dari fungsi ApiController Anda .
Sebenarnya, hanya melakukan await
dapat melakukan itu. Setelah async
metode Anda await
mengenai, metode diblokir tetapi utas kembali ke kumpulan utas. Ketika metode siap untuk melanjutkan, semua utas diambil dari kumpulan utas dan digunakan untuk melanjutkan metode.
Satu-satunya perbedaan ConfigureAwait
di ASP.NET adalah apakah utas itu memasuki konteks permintaan saat melanjutkan metode.
Saya memiliki lebih banyak informasi latar belakang di artikel MSDNSynchronizationContext
saya dan async
posting blog intro saya .
HttpContext.Current
mengalir oleh ASP.NETSynchronizationContext
, yang mengalir secara default saat Andaawait
, tetapi tidak mengalir olehContinueWith
. OTOH, konteks eksekusi (termasuk pembatasan keamanan) adalah konteks disebutkan dalam CLR melalui C #, dan itu adalah mengalir dengan baikContinueWith
danawait
(bahkan jika Anda menggunakanConfigureAwait(false)
).