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 asyncdi 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 asyncmetode 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 awaitdapat melakukan itu. Setelah asyncmetode Anda awaitmengenai, 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 ConfigureAwaitdi ASP.NET adalah apakah utas itu memasuki konteks permintaan saat melanjutkan metode.
Saya memiliki lebih banyak informasi latar belakang di artikel MSDNSynchronizationContext saya dan asyncposting blog intro saya .
HttpContext.Currentmengalir 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 baikContinueWithdanawait(bahkan jika Anda menggunakanConfigureAwait(false)).