[.Net] มาทำให้ Parallel.ForEach Debug ง่ายกันเถอะ

หลังจากหายไปพักนึง หลังากลองตบตีกพวก Thread มาสักพักใหญ่แล้ว วันนี้ขอประเดิม Blog เลยและกันครับ สำหรับตัว Microsoft .Net Framework ถ้าใครใ้ตั้งแต่ 4.0 เป็นต้นไป มันมีชุดคำสั่งสำหรับทำงานแบบ Parallel ด้วยครับ ซึ่งหนึ่งในนั้น คือ Parallel.ForEach นั้นเองครับ

แล้ว Parallel.ForEach คือ อะไร

มันเหมือน ForEach แหละ แต่ต่างกันที่ ForEach ทำคนเดียว แต่ Parallel.ForEach ช่วยกันทำครับ

มันก็ดีช่วงกันทำนี่ แล้วมันมีปัญหาอะไร

unittestvsintragrationtest

ก็ตอนมี Bug ไงครับ ยิ่งเป็น Runtime Exception แล้ว จับได้ยากครับ เพราะ Parallel.ForEach มันแบ่งงานกันทำ เราจะรู้ได้อย่างไรว่า งานที่แบ่งกันทำ งานขิ้นไหนที่มันมีปัญหาครับ

พระเอกของเรา มันอยู่ที่คู่มือครับ

ลอง Google ไปดูรูปแบบตัวอย่า่งการเรียกใช้ Parallel.ForEach ดูสิครับ พบว่ามันมี Parameter อยู่ตัวที่น่าสนใจครับ คือ ตัว ParallelOptions ครับ เมื่อมาดูตัว ParallelOptions มี property ตัวนึงที่น่าสนใจครับ MaxDegreeOfParallelism สำหรับ Property นี้เป็นการกำหนดงานที่ทำพร้อมๆกัน (Concurrent) ว่าทำได้สูงสุดเท่าไหร่ สำหรับค่า Default คือ -1 (no limit) ครับ หลังจากความหมายแล้ว ด้วยความอยากรู้ผมเลยลองกำหนดค่าเป็น 1 ใน Mode Debug ครับ

var parallelOptions = new ParallelOptions(); 
#if DEBUG 
	parallelOptions.MaxDegreeOfParallelism = 1; 
#endif
Parallel.ForEach(pDsetExpProcess.IVPPreProcessDSList, parallelOptions, IVPDataSourceEntry =>
{
	try
	{
		#region Process Detail
		/*
		 * Do Something - สำหรับ Code ที่ผมเขียนอยู่เป็นการสร้าง DataSet IVP เพื่อส่งรายงานใช้ BOT ครับ
		 */
		#endregion Process Detail
	}
	catch (Exception e)
	{
		logger.Debug("Error Message : " + e.StackTrace);
	}
});

ผลปรากฏว่า ผมสามารถ Debug Code เพื่อหาข้อผิดพลาดได้ครับ มันดีมากเลยยย ^___^

สำหรับ Blog ตอนต่อไปที่จะเขียน ถ้าว่าง คือ Pattern สำหรับการใช้ตัว Parallel.ForEach ครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.