การใช้งาน IHttpHandler.IsReusable คืออะไร?


105

ฉันกำลังเขียนIHttpHandlerและฉันจะต้องใช้IsReusableคุณสมบัติ เมื่อฉันดูเอกสาร MSDNมันบอกว่า:

รับค่าที่ระบุว่าคำขออื่นสามารถใช้อินสแตนซ์ IHttpHandler ได้หรือไม่

สิ่งนี้ไม่เป็นประโยชน์มากนัก ฉันควรใช้ตัวจัดการแบบใช้ซ้ำได้ในสถานการณ์ใดและในสถานการณ์ใดที่ไม่ควรใช้ซ้ำ

ติดตามคำถาม:

  1. Reuse คืออะไร?
  2. ฉันสามารถรักษาสถานะ (เช่นตัวแปรคลาส) เมื่อใดReusable = true??

9
มีลักษณะที่นี่: foreachbiscuit.wordpress.com/2007/11/01/...
โฮมาม

"ใช้ซ้ำ" หมายถึงจัดการคำขอมากกว่าหนึ่งรายการกับอินสแตนซ์เฉพาะของตัวจัดการ คุณสามารถจัดเก็บอะไรก็ได้ในเซสชัน - จะไม่ได้รับผลกระทบเมื่อปล่อยอินสแตนซ์ของตัวจัดการ
IrishChieftain

@IrishChieftain มันเหมือนกับว่า. Net เก็บกระเป๋าของ HttpHandlers ที่สร้างอินสแตนซ์แล้วเลือกหนึ่งและเพียงแค่ป้อนบริบท?
Kees C.Bakker

1
@IrishChieftain ตอนนี้ฉันใช้มันเพื่อสตรีมข้อมูลบันทึกบางอย่างง่ายๆ แต่ฉันกำลังพยายามเรียนรู้ว่าผลกระทบคืออะไรเพื่อทำความเข้าใจว่าจะใช้ IHttpHandlers เมื่อใดและอย่างไร พวกเขาเป็นคุณสมบัติที่หลายคนลืม
Kees C. Bakker

คำตอบ:


94

คุณสมบัตินี้ระบุว่าสามารถดำเนินการกับคำขอหลายรายการด้วยอินสแตนซ์ IHttpHandler เดียวกันได้หรือไม่ โดยดีฟอลต์ที่ส่วนท้ายของคำร้องขอไปป์ไลน์ตัวจัดการ http ทั้งหมดที่วางใน handlerRecycleList ของ HttpApplication จะถูกตั้งค่าเป็น null หากตัวจัดการสามารถใช้ซ้ำได้จะไม่ถูกตั้งค่าเป็นโมฆะและอินสแตนซ์จะถูกใช้ซ้ำในคำขอถัดไป

ผลประโยชน์หลักคือประสิทธิภาพเนื่องจากจะมีวัตถุให้เก็บขยะน้อยลง
ความเจ็บปวดที่สำคัญที่สุดสำหรับตัวจัดการแบบใช้ซ้ำได้คือต้องปลอดภัยต่อด้าย นี่ไม่ใช่เรื่องเล็กน้อยและต้องใช้ความพยายาม

โดยส่วนตัวแล้วฉันขอแนะนำให้คุณปล่อยค่าเริ่มต้นไว้ (ไม่สามารถใช้ซ้ำได้) หากคุณใช้เฉพาะทรัพยากรที่มีการจัดการเนื่องจาก Garbage Collector ควรจัดการได้อย่างง่ายดาย ประสิทธิภาพที่ได้รับจากตัวจัดการแบบใช้ซ้ำได้มักจะน้อยมากเมื่อเทียบกับความเสี่ยงที่จะพบข้อบกพร่องของเธรดที่หายาก

หากคุณตัดสินใจที่จะใช้ตัวจัดการซ้ำคุณควรหลีกเลี่ยงการรักษาสถานะในตัวแปรคลาสเพราะหากอินสแตนซ์ตัวจัดการถูกเข้าถึงพร้อมกันหลายคำขอจะเขียน / อ่านค่า


1
คำแนะนำสุดท้ายของคุณเพื่อหลีกเลี่ยงการรักษาสถานะในตัวแปรคลาสทำให้สับสนเล็กน้อย สมมติว่าคุณตั้งค่า IsReusable เป็นเท็จจะไม่มีความเป็นไปได้ที่จะมีคำขออื่น (พร้อมกันหรือไม่) เข้าถึงอินสแตนซ์เดียวกันของ HttpHandler นั้นดังนั้นการรักษาสถานะในตัวแปรคลาสจะปลอดภัยหรือไม่?
Ben Amada

2
แน่นอน ฉันได้เปลี่ยนคำแนะนำครั้งล่าสุดโดยเน้นว่าจะใช้ได้เฉพาะในกรณีที่มีการใช้ IHttpHandler ซ้ำ ขอบคุณสำหรับคำชี้แจงเบ็น!
Branislav Abadjimarinov

7
สำหรับสิ่งที่คุ้มค่าฉันได้ใช้หลายตัวหลายตัวIHttpHandlerที่IsReusableตั้งค่าเป็นtrueและไม่มีปัญหา สิ่งสำคัญที่ควรทราบคืออย่าให้ตัวแปรใด ๆ กำหนดขอบเขตของคลาส แต่ให้ใช้ตัวแปรท้องถิ่นในฟังก์ชันของคุณ
dana

6
คำอธิบายที่ยอดเยี่ยม ชัดเจนและตรงประเด็น ฉันหวังว่าบทความ MSDN จะกระชับ
AlexVPerl

1
@Branislav - ถ้าฉันเข้าใจคำตอบของคุณถูกต้อง ไม่เพียง แต่เป็นไปได้สำหรับเธรดที่แตกต่างกันที่จะใช้อินสแตนซ์ที่แตกต่างกันของตัวจัดการพร้อมกัน แต่ยังเป็นไปได้ที่เธรดที่แตกต่างกันจะเรียกใช้อินสแตนซ์ SAME ของตัวจัดการพร้อมกัน?
เอียน

11

เห็นได้ชัดว่าสิ่งนี้ทำให้ตัวจัดการอยู่ในหน่วยความจำและสามารถจัดการคำขอหลายรายการได้ เมื่อตั้งค่าเป็นเท็จจะต้องสร้างอินสแตนซ์ใหม่ของตัวจัดการสำหรับแต่ละคำขอที่เข้ามา

นี่คือคำถามที่แสดงให้เห็นว่าเกิดอะไรขึ้นเมื่อใช้ไม่ถูกต้อง:

การสตรีมรูปภาพที่ใช้ฐานข้อมูลโดยใช้ HttpHandler


คุณมีเอกสารสนับสนุนคำตอบของคุณหรือไม่?
Kees C.Bakker

4
เช่นเดียวกับคุณฉันไม่พบเอกสารที่น่าพอใจใน MSDN ดังนั้นฉันจึงต้องทดสอบการโหลดรูปภาพจากฐานข้อมูลไปยังหน้าของไซต์อีคอมเมิร์ซแล้วสังเกตสิ่งที่เกิดขึ้น :)
IrishChieftain

5

การรีไซเคิลตัวจัดการนั้นถูกกว่าการรีไซเคิลตัวจัดการใหม่ทุกครั้งที่มีคำขอเข้ามาและเซิร์ฟเวอร์จะเก็บหน่วยความจำน้อยลงทำให้งาน GC ต้องดำเนินการได้ง่ายขึ้น หากตัวจัดการอยู่ในสถานะที่การจัดการกับคำร้องขอใหม่จะไม่มีปัญหา(เช่นสถานะใด ๆ ในอินสแตนซ์ตัวจัดการถูกรีเซ็ต)ก็ควรมีคุณสมบัติที่สามารถนำกลับมาใช้ใหม่ได้

แก้ไข

ฉันไม่แน่ใจว่าคำตอบของฉันกำหนดสิ่งที่ใช้ซ้ำได้ถูกต้องหรือไม่ มันช่วยให้สามารถใช้ซ้ำได้พร้อมกันดังนั้นสถานะที่มีประสิทธิภาพจะหลีกเลี่ยงได้ดีที่สุดหรือจัดการอย่างระมัดระวังในลักษณะที่ปลอดภัยต่อเธรด


ฉันก็คิดอย่างนั้นเหมือนกัน คุณพูดถูกคำถาม (พื้นฐาน) ที่แท้จริงคือ 'การนำกลับมาใช้ใหม่คืออะไร?'
Kees C.Bakker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.