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

เมธอดของคลาส Thread ใน C#

เมธอดสำคัญของคลาส Thread ใน C#

คลาส System.Threading.Thread มีเมธอดสำคัญดังต่อไปนี้ (บางเมธอดเป็น static, บางอันเป็น instance)

ตารางเมธอดหลัก

#เมธอดประเภทคำอธิบาย
1Start()Instanceเริ่มรันเธรด (เรียก delegate ที่ส่งใน constructor)
2Sleep(ms)Staticหยุดเธรดปัจจุบันเป็นมิลลิวินาที
3Join()Instanceรอเธรดนี้จบการทำงาน (มี overload timeout)
4Abort()Instanceยกเลิกเธรด (Deprecated, โยน ThreadAbortException)
5Interrupt()Instanceขัดจังหวะเธรดที่อยู่ใน WaitSleepJoin state
6ResetAbort()Staticยกเลิก Abort() ที่รออยู่ (เฉพาะใน catch ThreadAbortException)
7SpinWait(iterations)StaticBusy-wait รอจำนวนรอบ (สำหรับ low-latency)
8MemoryBarrier()StaticMemory fence - กัน reordering ของ CPU/compiler
9GetDomain()Staticคืน AppDomain ปัจจุบัน
10GetDomainID()Staticคืน ID ของ AppDomain

Data Slot Methods (Thread Local Storage)

เมธอดคำอธิบาย
AllocateDataSlot()จอง slot แบบไม่มีชื่อ สำหรับทุกเธรด
AllocateNamedDataSlot(name)จอง slot แบบมีชื่อ
FreeNamedDataSlot(name)ปล่อย named slot
GetData(slot)อ่านค่าจาก slot
SetData(slot, data)เขียนค่าลง slot
GetNamedDataSlot(name)ค้นหา named slot

แนะนำ: ใช้ [ThreadStatic] attribute หรือ ThreadLocal<T> แทน Data Slots

Critical Region Methods (สำหรับ Host)

เมธอดคำอธิบาย
BeginCriticalRegion()แจ้ง host ว่าจะเข้าพื้นที่สำคัญ (abort/exception อาจส่งผลกว้าง)
EndCriticalRegion()แจ้ง host ออกจากพื้นที่สำคัญ
BeginThreadAffinity()แจ้ง host ว่าจะผูกกับ OS thread
EndThreadAffinity()แจ้ง host ปลดผูก OS thread

ตัวอย่างการใช้งานเมธอดหลัก


using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // Start
        Thread t = new Thread(Worker);
        t.Name = "Worker";
        t.Start();
        
        // Join - รอจบ
        t.Join();
        Console.WriteLine("Thread finished");
        
        // Sleep
        Console.WriteLine("Sleeping 1 sec...");
        Thread.Sleep(1000);
        
        // Interrupt
        Thread t2 = new Thread(Waiter);
        t2.Start();
        Thread.Sleep(100);
        t2.Interrupt(); // ขัดจังหวะ Wait/Sleep/Join
        t2.Join();
    }

    static void Worker()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"Working {i}");
            Thread.Sleep(100);
        }
    }

    static void Waiter()
    {
        try
        {
            Thread.Sleep(Timeout.Infinite); // รอนาน
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("Interrupted!");
        }
    }
}

Properties สำคัญ

Propertyคำอธิบาย
CurrentThreadStatic - เธรดที่กำลังรัน
IsAliveเธรดยังทำงานอยู่ (Started และไม่ได้ Terminate)
IsBackgroundBackground thread (ไม่กัน process ปิด) - get/set
IsThreadPoolThreadเป็น Thread Pool thread หรือไม่
ManagedThreadIdUnique ID ของ managed thread
Nameชื่อเธรด (debugging) - get/set
PriorityPriority: Lowest, BelowNormal, Normal, AboveNormal, Highest
ThreadStateสถานะ: Unstarted, Running, WaitSleepJoin, Suspended, Aborted, Stopped

แนวทางสมัยใหม่: ใช้ Task แทน


// แทน Thread.Start()
Task.Run(() => DoWork());

// แทน Thread.Sleep()
await Task.Delay(1000);

// แทน Thread.Join()
await task;

// แทน Thread.Abort() - ใช้ CancellationToken
var cts = new CancellationTokenSource();
Task.Run(() => DoWork(cts.Token), cts.Token);
cts.Cancel();