ภาษา C# การใช้ Thread ใน Window Application
หาไปเกือบเดือนงานยุ่งจนค่อยมีเวลา หรือบ้างทีพอมีเวลาแต่ก็ไม่มีอารมณ์เขียนบทความ เพราะการเขียนบทความอะไรมันต้องอาศัยสมาธิและอารมณ์ในการเขียนบทความ ในครั้งนี้จะเป็นการใช้ thread ในภาษา C# โดยปกติแล้วเวลาเราเขียน window application ด้วย visual studio นั้นเวลาเราคลิกปุ่มแล้วก็จะไปทำงานอะไรสักอย่าง จะสังเกตเห็นว่าตัวโปรแกรมของเราจะดูค้างๆ มันเป็นแบบนี้เพราะ window form ก็ถือว่าเป็น task อันหนึ่ง แล้วเมื่อกดปุ่มทำงานอะไรสักอย่างมันก็ทำงานอีกอย่างถ้าเราไม่ใช้ thread มันก็ต้องรองานที่เกิดจากเรากดปุ่มเสร็จก่อน โปรแกรมเราก็จะกับมาทำงานไม่ค้างนั้นเอง
Thread มันคืออะไร ? มันก็คือการแบ่งงานออกแบ่งส่วนๆ แยกกันทำงานของใครของมันนั้นเอง เมื่อเป็นแบบนี้แล้วเราก็สามารถทำให้โปรแกรมเราทำงานเสร็จได้เร็วขึ้นนั้นเอง เรามาเริ่มการเขียนโปรแกรม C# กันเลยดีกว่า ขั้นแรกก็เปิด visual studio 2010 ขึ้นมาแล้วเลือกเป็น c# แล้วก็ Window Application
จากนั้นให้เราสร้าง label และ button ตามรูปโดยกำหนด properties ของ button ดังนี้โดยให้ Name เป็น btnStartThread ส่วน Text เป็น Start Thread จากนั้นก็ดับเบิ้ลคลิกที่ button เพื่อเขียนโค้ด
[sourcecode language=”c#”]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WinTheard
{
public partial class Form1 : Form
{
delegate void StringParameterDelegate(int count);
public Form1()
{
InitializeComponent();
}
private void btnStartThread_Click(object sender, EventArgs e)
{
Thread workThread = new Thread(new ThreadStart(Counting));
workThread.IsBackground = true;
workThread.Start();
}
private void Counting()
{
for (int i = 0; i < 10000000; i++)
{
UpdateLabelCount(i);
Thread.Sleep(100);
}
}
private void UpdateLabelCount(int count)
{
if (InvokeRequired)
{
// We're not in the UI thread, so we need to call BeginInvoke
BeginInvoke(new StringParameterDelegate(UpdateLabelCount), new object[] { count });
return;
}
label1.Text = count.ToString();
}
}
}
[/sourcecode]
การที่เราใช้ Thread ทำให้งานมันแยกออกเป็นหลายส่วน ก็เปรียบเหมือนมีคนมาช่วยเราทำงานเพิ่มมาตามจำนวน Thread ที่เราสร้างขึ้นโดยปกติแล้วถ้าเราเจอลูปแล้วสั่งให้ update label มันจะค้างเพราะ process มันจะทำทั้งวนลูปแล้วก็จะไป update window form ไม่ได้เพราะจะต้องรอให้วนลูปเสร็จถึงจะไป update window form ได้แต่ในโค้ดนี้มันจะแยกเป็น 2 ส่วนโดยอันแรกเป็น Thread สำหรับแสดง window form อยู่แล้วส่วนอีกอันจะเอาไว้วนลูป
โดยจากโค้ดตัวอย่างเรามีโค้ดใน button ให้ทำการสร้าง Thread โดย Thread นั้นจะทำงานโดยไปทำใน method Counting แล้วใน Counting ก็มีการเรียก UpdateLabelCount ให้ทำการ set label ซึ่ง label อยู่ในความรับผิดชอบในส่วนของ Thread หลักที่แสดง Window Form อยู่แล้วมันเลยแสดงผลได้ทันทีโปรแกรมเลยไม่รู้สึกว่าค้างๆๆ แล้วมีการสั่ง ให้ Thread Sleep เพื่อที่ Thread อันที่เราสร้างขึ้นทำงานตลอดจนทำให้ค่าตัวแปรที่ส่งไปหรือทำงานร่วมกับตัวอื่นมีค่าไม่ตรงกัน และมีการเรียกใช้ BeginInvoke เพื่อเป็นการดึงค่าระหว่าง Thread โค้ดหลักๆก็ไม่มีอะไรมากเลยไม่ได้อธิบายโค้ดละเอียดมากเท่าไรแต่สรุปก็คือ code button จะสร้าง Thread ไปเรียกใช้ method อื่น และถ้าต้องการอัพเดต window form เพื่อแสดงสถานะก็ต้องมีการเรียกใช้ BeginInvoke และตรวจสอบเงื่อนไข InvokeRequired
ด้วยตามตัวอย่างนะครับ หากข้อมูลในบทความมีความผิดพลาดประการใดบอกด้วยนะครับเพราะผมเขียนจากที่ผมเข้าใจ