Signifikansi bool IsReusable dalam antarmuka http handler

Jawaban:

152

Titik masuk normal untuk penangan adalah metode ProcessRequest. Namun Anda mungkin memiliki kode di konstruktor kelas yang menyatukan beberapa nilai instance yang mahal untuk dibangun.

Jika Anda menentukan Reusable true, aplikasi dapat menyimpan instance dan menggunakannya kembali dalam permintaan lain hanya dengan memanggil metode ProcessRequest berulang kali, tanpa harus merekonstruksi setiap kali.

Aplikasi ini akan instantiate sebanyak dari penangan ini karena perlu untuk menangani beban saat ini.

Kelemahannya adalah bahwa jika jumlah instance yang dibutuhkan lebih besar dari instance yang ada sekarang, mereka menyebabkan lebih banyak memori yang digunakan. Sebaliknya mereka juga dapat mengurangi penggunaan memori karena nilai instance mereka akan bertahan siklus GC dan tidak perlu sering dialokasikan ulang.

Peringatan lain adalah Anda perlu memastikan bahwa pada akhir eksekusi ProcessRequest keadaan objek adalah seperti yang Anda inginkan untuk permintaan lain untuk menggunakan kembali objek.

AnthonyWJones
sumber
2
Anda menyebutkan penggunaan kembali objek sebagai optimasi kunci yang dicapai dengan menentukan IsReusable = True. Akan mengatur IsReusable = Hasil palsu di server tidak pernah instantiating beberapa contoh dari handler yang pernah ada. IE - apakah itu menghilangkan permintaan bersamaan?
Ian
@Ian saya percaya itu kemudian berfungsi sebagai halaman normal ketika reusable salah, meskipun saya mungkin salah. Ketika itu dapat digunakan kembali mungkin dapat menangani 6 permintaan bersamaan dengan 2 atau 3 contoh (hanya contoh) sedangkan ketika tidak dapat digunakan kembali akan membutuhkan proses / contoh 1: 1. Saya tidak bisa membayangkan. Net akan membiarkan permintaan menumpuk ketika 1 pekerja thread mencoba untuk menangani semuanya sambil terus menyegarkan / menginisialisasi ulang negaranya.
DavidScherer
47

Lebih lanjut untuk jawaban AnthonyWJones ini, jika Anda kembali HTTP handler trueuntuk IsReusablemaka Anda harus memastikan bahwa itu sepenuhnya benang-aman.

Tidak ada dalam dokumentasi untuk menunjukkan bahwa penangan yang dapat digunakan kembali tidak dapat digunakan kembali secara bersamaan, meskipun implementasi Microsoft saat ini hanya tampaknya menggunakan kembali secara berurutan. Tetapi, setidaknya dalam teori, instance handler tunggal dapat digunakan kembali secara bersamaan oleh beberapa permintaan, jadi Anda tidak boleh bergantung pada data apa pun yang mungkin dimodifikasi oleh utas bersamaan lainnya.

LukeH
sumber
Maaf karena terlalu tebal, tetapi bisakah seseorang tolong menguraikan apa yang dimaksud dengan "saklar konteks". Jika Anda mengakses sesuatu dari sesson atau string kueri (content.Request.QueryString) apakah itu dapat digunakan kembali atau tidak?
zod
5
Pergantian konteks adalah ketika CPU berhenti memproses pada satu utas dan mulai memproses pada yang lain. Yaitu CPU mengubah konteksnya dari satu utas ke utas lainnya. Ini terjadi terus menerus di PC, itu memberi kami ilusi multitasking sebelum ada komputer multicore.
Larry Dukek
Saya tidak bisa mengerti ketika Anda berkata Mungkin ada perubahan konteks kapan saja . Saat kami mengetikkan url dan menekan enter, ini mengeksekusi satu permintaan sekaligus. Baik ?
Peralihan konteks akan menjadi masalah ketika banyak pengguna menggunakan aplikasi pada saat yang sama. Misalnya, jika dua pengguna ingin memperbarui catatan yang sama pada saat yang sama, pengalih konteks dapat menyebabkan masalah.
Ismael Smyrnow
7
Pernyataan tentang IsReusableperlunya keamanan benang ini tampaknya bertentangan dengan respons AnthonyWJones. Seperti yang saya pahami paragraf ketiga (Aplikasi akan instantiate sebanyak ...), instance handler yang dapat digunakan kembali tidak akan digunakan kembali secara bersamaan, tetapi hanya setelah menyelesaikan pemrosesan saat ini. Jika ini benar, maka tidak perlu ada thread aman.
Frédéric
3

Jika Anda tidak menyimpan keadaan apa pun dalam contoh itu (yaitu: Anda tidak memiliki bidang apa pun (alias "variabel kelas")) maka Anda harus aman menggunakannya kembali.

Secara default salah berada di sisi aman.

Andrei Rînea
sumber