วันนี้มาเขียน Blog ดึกไปหน่อย ถือว่าฉลองเดือนธันวาคมที่แสนอบอุ่นและกัน 555 มาเข้าเรื่องกัน โดยหลายๆครั้งที่เราต้องพัฒนา Console App เพื่อทำงานในลักษณะที่เป็น Background Process ถ้าเป็นการเรียกใช้งานผ่านตัว User หรือ Application อื่นๆ อย่าง Winform โดยตรงมันก็ไม่มีปัญหาอะไรนัก แต่ถ้าเป็นการเรียกใช้ผ่าน Task Schedule หละ ?
ปัญหาของผม คือ ว่า เราจะทำให้ตัว Task Schedule(หรืออาจจะเป็น App อื่นที่เรียกใช้ใน Batch) รู้ได้อย่างไรว่า Exe ที่เรียกใข้งาน มันทำงานเสร็จแล้ว ?
ในตอนแรก ผมคิดว่าต้อง Kill Process นี้ทิ่งด้วยคำสั่ง
[c language="#"]
Environment.Exit();
[/c]
แต่สิ่งที่ผมคิดนั้น มันผิด เพราะตัว Caller อย่าง Task Schedule มันไม่รู้ว่าไฟล์ .exe ของเราเนี่ย ทำงานเสร็จ หรือยัง ทำให้เมื่่อถือเวลาที่ Schedule นั้นต้องทำงานอีกรอบ ระบบได้ไปสร้าง Thread ใหม่ขึ้นมาทำงานขนานกัน ซึ่ง Task ของผมตั้งให้มันทำงานทุกๆ 1 ชั่วโมง แต่ละครั้งมันจะใช้ Memory ประมาณ 500 MB ถ้าเจ้า Task Schedule มันไปสร้าง Thread ใหม่อีก 10 ครั้งหละ ?
!!! System down !!!
ลองไล่ดูอีกทีเราจะพบว่าทำไมระบบถึง Down ได้ สาเหตุเพราะว่าเจ้า Task Schedule มันไปสร้าง Task งานทุกๆ 1 ชั่วโมง ผ่านไป 10 ชั่วโมง ก็มี 10 Task และเสีย Memory ไปทั้งหมด 5GB ครับ
ทางแก้ไขมีหลายทางคร้บ เช่น ตอนสร้าง Task ในมันตรวจสอบก่อนว่ามีงานเดิมทำอยู่ หรือปาว แล้วจัดการ End Task ก่อนที่จะเริ่มงานใหม่ หรือ เราจะแก้ที่ Code เรา โดยเพิ่ม ExitCode เพื่อบอกสถานะการทำงานต่างๆ เช่น
0 คือ ทำงานสำเร็จ
-1 คือ ข้อมูล Input มีปัญหา เป็นต้นครับ
[c language="#"]
Environment.ExitCode = 0;
[/c]
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.