เมธอดสำคัญของคลาส Thread ใน C#
คลาส System.Threading.Thread มีเมธอดสำคัญดังต่อไปนี้ (บางเมธอดเป็น static, บางอันเป็น instance)
ตารางเมธอดหลัก
| # | เมธอด | ประเภท | คำอธิบาย |
| 1 | Start() | Instance | เริ่มรันเธรด (เรียก delegate ที่ส่งใน constructor) |
| 2 | Sleep(ms) | Static | หยุดเธรดปัจจุบันเป็นมิลลิวินาที |
| 3 | Join() | Instance | รอเธรดนี้จบการทำงาน (มี overload timeout) |
| 4 | Abort() | Instance | ยกเลิกเธรด (Deprecated, โยน ThreadAbortException) |
| 5 | Interrupt() | Instance | ขัดจังหวะเธรดที่อยู่ใน WaitSleepJoin state |
| 6 | ResetAbort() | Static | ยกเลิก Abort() ที่รออยู่ (เฉพาะใน catch ThreadAbortException) |
| 7 | SpinWait(iterations) | Static | Busy-wait รอจำนวนรอบ (สำหรับ low-latency) |
| 8 | MemoryBarrier() | Static | Memory fence - กัน reordering ของ CPU/compiler |
| 9 | GetDomain() | Static | คืน AppDomain ปัจจุบัน |
| 10 | GetDomainID() | 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 | คำอธิบาย |
CurrentThread | Static - เธรดที่กำลังรัน |
IsAlive | เธรดยังทำงานอยู่ (Started และไม่ได้ Terminate) |
IsBackground | Background thread (ไม่กัน process ปิด) - get/set |
IsThreadPoolThread | เป็น Thread Pool thread หรือไม่ |
ManagedThreadId | Unique ID ของ managed thread |
Name | ชื่อเธรด (debugging) - get/set |
Priority | Priority: 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();