Apa gunanya IHttpHandler.IsReusable?

105

Saya sedang menulis IHttpHandlerdan saya perlu menerapkan IsReusableproperti. Saat saya melihat dokumentasi MSDN , tertulis:

Mendapat nilai yang menunjukkan apakah permintaan lain dapat menggunakan instance IHttpHandler.

Ini tidak terlalu membantu. Dalam situasi apa saya harus menggunakan penangan yang dapat digunakan kembali dan dalam situasi apa penangan tersebut tidak dapat digunakan kembali?

Pertanyaan tindak lanjut:

  1. Apa itu reuse?
  2. Dapatkah saya mempertahankan status (yaitu variabel kelas) kapan Reusable = true??
Kees C. Bakker
sumber
"Reuse" berarti menangani lebih dari satu permintaan dengan contoh penangan tertentu. Anda dapat menyimpan apa pun di Sesi - ini tidak akan terpengaruh ketika contoh penangan dilepaskan.
IrishChieftain
@IrishChieftain Ini seperti .Net menyimpan sekantong HttpHandlers yang dipakai, mengambil satu dan hanya memberinya konteks?
Kees C. Bakker
1
@IrishChieftain sekarang saya menggunakannya untuk streamer sederhana dari beberapa informasi log. Tetapi saya mencoba mempelajari apa implikasinya untuk memahami kapan dan bagaimana menggunakan IHttpHandlers. Mereka adalah fitur yang terlupakan oleh banyak orang.
Kees C. Bakker

Jawaban:

94

Properti ini menunjukkan jika beberapa permintaan dapat diproses dengan instance IHttpHandler yang sama. Secara default di akhir pipeline permintaan semua penangan http yang ditempatkan di handlerRecycleList dari HttpApplication disetel ke null. Jika penangan dapat digunakan kembali, itu tidak akan disetel ke nol dan instance akan digunakan kembali dalam permintaan berikutnya.

Keuntungan utama adalah kinerja karena akan ada lebih sedikit objek untuk mengumpulkan sampah.
Masalah terpenting bagi penangan yang dapat digunakan kembali adalah bahwa itu harus aman untuk benang. Ini tidak sepele dan membutuhkan usaha.

Saya pribadi menyarankan agar Anda membiarkan nilai default (tidak dapat digunakan kembali) jika Anda hanya menggunakan sumber daya yang dikelola karena Pengumpul Sampah harus dengan mudah menanganinya. Keuntungan kinerja dari penangan yang dapat digunakan kembali biasanya dapat diabaikan dibandingkan dengan risiko memasukkan bug threading yang sulit ditemukan.

Jika Anda memutuskan untuk menggunakan kembali penangan, Anda harus menghindari mempertahankan status dalam variabel kelas karena jika contoh penangan diakses secara bersamaan beberapa permintaan akan menulis / membaca nilai.

Branislav Abadjimarinov
sumber
1
Rekomendasi terakhir Anda untuk menghindari mempertahankan status dalam variabel kelas agak membingungkan. Dengan asumsi Anda menyetel IsReusable ke false, bukankah tidak akan ada kemungkinan permintaan lain (bersamaan atau tidak) mengakses instance yang sama dari HttpHandler itu, dan oleh karena itu mempertahankan status dalam variabel kelas akan aman?
Ben Amada
2
Tentu. Saya telah menyusun ulang rekomendasi terakhir dengan menekankan bahwa ini hanya berlaku jika IHttpHandler digunakan kembali. Terima kasih atas klarifikasinya, Ben!
Branislav Abadjimarinov
7
Untuk apa nilainya, saya telah menerapkan banyak, banyak IHttpHandlerdengan IsReusableset truedan tidak memiliki masalah. Hal utama yang perlu diingat adalah tidak menyertakan variabel apa pun yang dicakup ke kelas, melainkan menggunakan variabel lokal dalam fungsi Anda.
dana
6
Penjelasan yang bagus. Jelas dan langsung ke sasaran. Saya berharap artikel MSDN sesingkat ini.
AlexVPerl
1
@ Branislav - Jika saya mengerti jawaban Anda dengan benar. Hal ini tidak hanya mungkin untuk utas yang berbeda untuk menggunakan contoh yang berbeda dari penangan secara bersamaan, tetapi juga mungkin untuk utas yang berbeda untuk mengeksekusi contoh yang SAMA dari penangan secara bersamaan?
Ian
11

Rupanya, ini membuat penangan tetap di memori dan mampu menangani banyak permintaan. Ketika disetel ke false, itu harus membuat contoh baru dari penangan untuk setiap permintaan yang masuk.

Inilah pertanyaan yang menunjukkan apa yang terjadi jika tidak digunakan dengan benar:

Streaming Gambar Berbasis Data Menggunakan HttpHandler

Kepala Suku Irlandia
sumber
Apakah Anda memiliki beberapa dokumentasi yang mendukung jawaban Anda?
Kees C. Bakker
4
Seperti Anda, saya tidak dapat menemukan dokumentasi yang memuaskan tentang MSDN, jadi saya harus menguji pemuatan gambar dari database ke halaman situs E-Commerce, lalu mengamati apa yang terjadi :)
IrishChieftain
5

Lebih murah untuk mendaur ulang penangan daripada yang baru setiap kali ada permintaan masuk dan server akan menggunakan lebih sedikit memori, memudahkan pekerjaan yang harus dilakukan GC. Jika penangan berada dalam keadaan dimana menangani permintaan baru tidak akan menjadi masalah (yaitu setiap keadaan dalam contoh penangan telah diatur ulang) , maka itu harus memenuhi syarat sebagai dapat digunakan kembali.

EDIT

Saya tidak yakin apakah jawaban saya dengan tepat mendefinisikan apa itu reuse. Ini benar-benar memungkinkan untuk penggunaan kembali secara bersamaan, sehingga status yang efektif akan lebih baik dihindari atau dikelola dengan hati-hati dengan cara yang aman untuk thread.

pemboros
sumber
Saya juga akan berpikir begitu. Anda benar, pertanyaan (mendasar) sebenarnya adalah: 'apa itu digunakan kembali?'
Kees C. Bakker