ตัวจับเวลาที่เชื่อถือได้ในแอปพลิเคชันคอนโซล


103

ฉันทราบว่าใน. NETมีตัวจับเวลาสามประเภท (ดูการเปรียบเทียบคลาสตัวจับเวลาใน. NET Framework Class Library ) ฉันเลือกตัวจับเวลาแบบเธรดเนื่องจากประเภทอื่น ๆ สามารถล่องลอยได้หากเธรดหลักไม่ว่างและฉันต้องการให้สิ่งนี้เชื่อถือได้

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

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

ฉันพยายามเพิ่มwhile trueลูป แต่เธรดหลักยุ่งเกินไปเมื่อตัวจับเวลาไม่ทำงาน

คำตอบ:


59

คุณสามารถใช้บางอย่างเช่นConsole.ReadLine()เพื่อบล็อกเธรดหลักดังนั้นเธรดพื้นหลังอื่น ๆ (เช่นเธรดตัวจับเวลา) จะยังใช้งานได้ คุณยังสามารถใช้AutoResetEventเพื่อบล็อกการดำเนินการจากนั้น (เมื่อคุณต้องการ) คุณสามารถเรียกใช้เมธอด Set () บนอ็อบเจ็กต์ AutoResetEvent นั้นเพื่อคลายเธรดหลัก ตรวจสอบให้แน่ใจว่าการอ้างอิงถึงวัตถุ Timer ของคุณไม่อยู่นอกขอบเขตและมีการรวบรวมขยะ


20

พิจารณาใช้ManualResetEventเพื่อบล็อกเธรดหลักเมื่อสิ้นสุดการประมวลผลและเรียกReset()ใช้เมื่อการประมวลผลของตัวจับเวลาเสร็จสิ้น หากนี่คือสิ่งที่ต้องทำงานอย่างต่อเนื่องให้พิจารณาย้ายสิ่งนี้เข้าสู่กระบวนการบริการแทนแอปคอนโซล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.