ภาษา C# การใช้ Thread ใน Window Application

ภาษา C# การใช้ Thread ใน Window Application

หาไปเกือบเดือนงานยุ่งจนค่อยมีเวลา หรือบ้างทีพอมีเวลาแต่ก็ไม่มีอารมณ์เขียนบทความ เพราะการเขียนบทความอะไรมันต้องอาศัยสมาธิและอารมณ์ในการเขียนบทความ ในครั้งนี้จะเป็นการใช้ thread ในภาษา C# โดยปกติแล้วเวลาเราเขียน window application ด้วย visual studio นั้นเวลาเราคลิกปุ่มแล้วก็จะไปทำงานอะไรสักอย่าง จะสังเกตเห็นว่าตัวโปรแกรมของเราจะดูค้างๆ มันเป็นแบบนี้เพราะ window form ก็ถือว่าเป็น task อันหนึ่ง แล้วเมื่อกดปุ่มทำงานอะไรสักอย่างมันก็ทำงานอีกอย่างถ้าเราไม่ใช้ thread มันก็ต้องรองานที่เกิดจากเรากดปุ่มเสร็จก่อน โปรแกรมเราก็จะกับมาทำงานไม่ค้างนั้นเอง

Thread มันคืออะไร ? มันก็คือการแบ่งงานออกแบ่งส่วนๆ แยกกันทำงานของใครของมันนั้นเอง เมื่อเป็นแบบนี้แล้วเราก็สามารถทำให้โปรแกรมเราทำงานเสร็จได้เร็วขึ้นนั้นเอง เรามาเริ่มการเขียนโปรแกรม C# กันเลยดีกว่า ขั้นแรกก็เปิด visual studio 2010 ขึ้นมาแล้วเลือกเป็น c# แล้วก็ Window Application

c sharp thread

 

c sharp thread

จากนั้นให้เราสร้าง 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 อยู่แล้วส่วนอีกอันจะเอาไว้วนลูป c sharp thread

 

 

 

thread

 

โดยจากโค้ดตัวอย่างเรามีโค้ดใน 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

ด้วยตามตัวอย่างนะครับ หากข้อมูลในบทความมีความผิดพลาดประการใดบอกด้วยนะครับเพราะผมเขียนจากที่ผมเข้าใจ

Download Source

Leave a Reply

Your email address will not be published. Required fields are marked *