[C#] คำแนะนำสำหรับการพัฒนา App แบบ Console เพื่อทำงานเป็น Batch ผ่าน Schedule Task

วันนี้มาเขียน 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.