Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีตรวจสอบสถานะปัจจุบันของ Thread ใน C#

ใน C# คลาส Thread (ใน System.Threading) มี property ThreadState ที่คืนค่าสถานะปัจจุบันของเธรดเป็น enum ThreadState ซึ่งเป็น flags (สามารถรวมสถานะได้หลายค่า) สถานะหลักได้แก่ Unstarted, Running, WaitSleepJoin, Suspended, Aborted, Stopped ฯลฯ

ตัวอย่างโค้ดที่ 1: เธรดที่ยังไม่เริ่ม

using System;
using System.Threading;

public class Demo
{
    public static void Main()
    {
        Thread thread = new Thread(new ThreadStart(Demo1));
        ThreadPool.QueueUserWorkItem(new WaitCallback(Demo2));

        Console.WriteLine("Current state of Thread = " + thread.ThreadState);
        Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
    }

    public static void Demo1()
    {
        Thread.Sleep(2000);
    }

    public static void Demo2(object stateInfo)
    {
        Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
    }
}

ผลลัพธ์

Current state of Thread = Unstarted
ManagedThreadId = 3

ตัวอย่างโค้ดที่ 2: เธรดเริ่มทำงานแล้ว

using System;
using System.Threading;

public class Demo
{
    public static void Main()
    {
        Thread thread = new Thread(new ThreadStart(Demo));
        Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
        Console.WriteLine("Current state of Thread = " + thread.ThreadState);
        thread.Start();
        Console.WriteLine("Current state of Thread = " + thread.ThreadState);
    }

    public static void Demo()
    {
        Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
    }
}

ผลลัพธ์

ManagedThreadId = 3
Current state of Thread = Unstarted
Thread belongs to managed thread pool? = False
Current state of Thread = Running

ค่า ThreadState ที่พบบ่อย

ค่าคำอธิบาย
Unstartedเธรดถูกสร้างแต่ยังไม่ได้เรียก Start()
Runningเธรดกำลังทำงานอยู่
WaitSleepJoinเธรดรอ (Wait, Sleep, Join)
Suspendedเธรดถูกระงับ (Deprecated)
AbortRequestedมีการขอ Abort
Stoppedเธรดสิ้นสุดการทำงานแล้ว
Backgroundเป็น Background thread

ข้อสังเกตสำคัญ

  • ThreadState เป็น bitwise flags - อาจมีหลายสถานะพร้อมกัน (เช่น Running | Background)
  • ใช้ (thread.ThreadState & ThreadState.Running) != 0 เพื่อตรวจสอบ flag เฉพาะ
  • ManagedThreadId เป็น ID เฉพาะของเธรดใน managed environment
  • IsThreadPoolThread บอกว่าเป็น thread pool thread หรือไม่
  • หลีกเลี่ยงการใช้ Thread.Abort(), Thread.Suspend(), Thread.Resume() - Deprecated และอันตราย

แนวทางสมัยใหม่ (Modern Approach)

ใน .NET สมัยใหม่ ควรใช้:

  • Task และ Task<T> แทน Thread โดยตรง
  • async/await สำหรับ asynchronous programming
  • ThreadPool.QueueUserWorkItem หรือ Task.Run() สำหรับงานพื้นหลัง
  • CancellationToken สำหรับการยกเลิกงาน แทน Thread.Abort()