ฉันทราบว่าไม่มีใครพูดถึงในคำตอบของพวกเขาสำหรับคำถามเก่า ๆ นี้ว่าการปลดล็อกข้อยกเว้นเป็นสิ่งที่อันตรายอย่างยิ่งที่ต้องทำ ใช่คำสั่งล็อคใน C # มีความหมาย "ในที่สุด"; เมื่อตัวควบคุมออกจากล็อคตามปกติหรือผิดปกติล็อคจะถูกคลายออก คุณทุกคนพูดถึงเรื่องนี้เหมือนเป็นเรื่องดี แต่มันเป็นสิ่งที่ไม่ดี! สิ่งที่ควรทำหากคุณมีพื้นที่ที่ถูกล็อกซึ่งทำให้เกิดข้อยกเว้นที่ไม่สามารถจัดการได้คือยุติกระบวนการที่เป็นโรคทันทีก่อนที่จะทำลายข้อมูลผู้ใช้มากขึ้นไม่ใช่ปล่อยล็อกและดำเนินการต่อ
ลองดูแบบนี้สมมติว่าคุณมีห้องน้ำที่ล็อคประตูและมีคนรออยู่ข้างนอก ระเบิดในห้องน้ำดับลงฆ่าคนในนั้น คำถามของคุณคือ "ในสถานการณ์นั้นจะมีการปลดล็อกโดยอัตโนมัติเพื่อให้คนถัดไปเข้าห้องน้ำได้หรือไม่" ใช่! ฉันจะ. นั่นไม่ใช่เรื่องดี ระเบิดลงที่นั่นและฆ่าใครบางคน! ประปาอาจจะถูกทำลายบ้านที่ไม่มีโครงสร้างเสียงและอาจจะมีระเบิดอีกในการมี สิ่งที่ควรทำคือพาทุกคนออกไปให้เร็วที่สุดและรื้อถอนบ้านทั้งหลัง
ฉันหมายถึงลองคิดดู: ถ้าคุณล็อคพื้นที่ของรหัสเพื่อที่จะอ่านจากโครงสร้างข้อมูลโดยที่มันไม่ถูกกลายพันธุ์ในเธรดอื่นและบางสิ่งในโครงสร้างข้อมูลนั้นมีข้อยกเว้นโอกาสที่ดีก็เป็นเพราะโครงสร้างข้อมูล เสียหาย ขณะนี้ข้อมูลผู้ใช้ยุ่งเหยิง คุณไม่ต้องการพยายามบันทึกข้อมูลผู้ใช้ณ จุดนี้เนื่องจากคุณกำลังบันทึกข้อมูลที่เสียหาย เพียงแค่ยุติกระบวนการ
หากคุณล็อคภูมิภาคของรหัสเพื่อดำเนินการกลายพันธุ์ที่ไม่มีหัวข้ออื่นอ่านรัฐในเวลาเดียวกันและการกลายพันธุ์พ่นแล้วถ้าข้อมูลไม่ได้เสียหายก่อนก็แน่ใจว่าอยู่ในขณะนี้ ซึ่งเป็นสิ่งสถานการณ์ที่ล็อคควรจะป้องกัน ตอนนี้รหัสที่รออ่านสถานะนั้นจะได้รับสิทธิ์เข้าถึงสถานะเสียหายทันทีและอาจเกิดปัญหาขึ้นเอง อีกครั้งสิ่งที่ถูกต้องคือยุติกระบวนการ
ไม่ว่าคุณจะเชือดมันเป็นข้อยกเว้นภายในล็อคเป็นข่าวร้าย คำถามที่ถูกต้องที่จะถามไม่ใช่ "ล็อคของฉันจะถูกล้างในกรณีที่มีข้อยกเว้นหรือไม่" คำถามที่ถูกต้องคือ "ฉันจะแน่ใจได้อย่างไรว่าจะไม่มีข้อยกเว้นภายในตัวล็อคและถ้ามีฉันจะจัดโครงสร้างโปรแกรมของฉันอย่างไรเพื่อให้การกลายพันธุ์ถูกย้อนกลับไปสู่สถานะที่ดีก่อนหน้านี้"