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

วิธีดึง Thread ID จาก Thread ใน C#

การทำงานกับ Thread และดึง Thread ID ใน C#

Thread คือเส้นทางการทำงานของโปรแกรม แต่ละ thread มีการควบคุม flow แยกกัน ใน C# ใช้คลาส System.Threading.Thread สำหรับจัดการ thread

คุณสมบัติสำคัญของ Thread

คุณสมบัติคำอธิบาย
ManagedThreadIdID เฉพาะของ managed thread (int) - ใช้สำหรับระบุตัวตน thread
CurrentThreadStatic property คืนค่า thread ที่กำลังทำงานอยู่
Nameชื่อ thread (ตั้งได้ครั้งเดียว)
IsAlivethread กำลังทำงานอยู่หรือไม่
IsBackgroundเป็น background thread หรือไม่
ThreadStateสถานะปัจจุบันของ thread

ตัวอย่าง: ดึง ID ของ Main Thread

using System;
using System.Threading;

class Program
{
    public static void Main()
    {
        Thread currentThread = Thread.CurrentThread;
        currentThread.Name = "Main Thread";
        
        Console.WriteLine($"ชื่อ Thread: {currentThread.Name}");
        Console.WriteLine($"Managed Thread ID: {currentThread.ManagedThreadId}");
        Console.WriteLine($"สถานะ: {currentThread.ThreadState}");
        Console.WriteLine($"Is Alive: {currentThread.IsAlive}");
        Console.WriteLine($"Is Background: {currentThread.IsBackground}");
    }
}

ผลลัพธ์:

ชื่อ Thread: Main Thread
Managed Thread ID: 1
สถานะ: Running
Is Alive: True
Is Background: False

ตัวอย่าง: สร้าง Child Thread และดึง ID

using System;
using System.Threading;

class Program
{
    public static void Main()
    {
        Console.WriteLine($"Main Thread ID: {Thread.CurrentThread.ManagedThreadId}");
        
        Thread childThread = new Thread(DoWork);
        childThread.Name = "Worker Thread";
        childThread.Start();
        
        // รอให้ child thread ทำงานเสร็จ
        childThread.Join();
        
        Console.WriteLine("Child thread จบการทำงานแล้ว");
    }
    
    static void DoWork()
    {
        Console.WriteLine($"Child Thread ID: {Thread.CurrentThread.ManagedThreadId}");
        Console.WriteLine($"Child Thread Name: {Thread.CurrentThread.Name}");
        Thread.Sleep(1000);  // จำลองงาน
    }
}

ผลลัพธ์:

Main Thread ID: 1
Child Thread ID: 4
Child Thread Name: Worker Thread
Child thread จบการทำงานแล้ว

Thread ID vs Process ID

  • ManagedThreadId - ID ภายใน .NET runtime (managed) เริ่มจาก 1 เพิ่มทีละ 1
  • OS Thread ID - ID ของระบบปฏิบัติการ (native) ดึงได้จาก System.Diagnostics.Process.GetCurrentProcess().Threads
  • Process ID - Process.GetCurrentProcess().Id เหมือนกันทุก thread ใน process เดียวกัน

ใน .NET Core / .NET 5+ : Task และ Thread Pool

โค้ดสมัยใหม่มักใช้ Task และ ThreadPool แทนการสร้าง Thread โดยตรง:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine($"Main Thread ID: {Thread.CurrentThread.ManagedThreadId}");
        
        // Task รันบน ThreadPool thread
        await Task.Run(() =>
        {
            Console.WriteLine($"Task Thread ID: {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine($"Is ThreadPool: {Thread.CurrentThread.IsThreadPoolThread}");
        });
        
        // Parallel.ForEach
        Parallel.ForEach(new[] { 1, 2, 3 }, i =>
        {
            Console.WriteLine($"Parallel Item {i} on Thread: {Thread.CurrentThread.ManagedThreadId}");
        });
    }
}

สรุป

  • ใช้ Thread.CurrentThread.ManagedThreadId เพื่อดึง ID ของ thread ปัจจุบัน
  • Main thread มักมี ID = 1
  • Thread ID ไม่ได้ recycle ทันที (เพิ่มขึ้นเรื่อยๆ จนถึง int.MaxValue)
  • ใน async/await ใช้ Thread.CurrentThread.ManagedThreadId ได้เหมือนกัน แต่อาจสลับ thread ระหว่าง await