ThreadPool เป็นคลาสในเนมสเปซ System.Threading ซึ่งเป็นส่วนหนึ่งของ .NET มาตั้งแต่เริ่มต้น มันช่วยให้นักพัฒนาสามารถใช้กลุ่มของเธรดที่ทำงานเบื้องหลังเพื่อประมวลผลงานที่มอบหมายมา หนึ่งในลักษณะเด่นของเธรดพูลคือมันทำงานที่ลำดับความสำคัญเริ่มต้น และเมื่อเธรดทำงานเสร็จแล้ว จะถูกส่งกลับไปยังพูลเพื่อรอรับงานใหม่ คุณสามารถคิวงานในเธรดพูลได้ตามจำนวนหน่วยความจำที่มีอยู่ อย่างไรก็ตาม จำนวนของเธรดที่ทำงานได้พร้อมกันจะถูกจำกัดด้วยความสามารถของโปรเซสเซอร์และกระบวนการอื่นๆ ที่ทำงานอยู่
ตัวอย่างการใช้ ThreadPool.QueueUserWorkItem:
Console.WriteLine("Hello, World!");
ThreadPool.QueueUserWorkItem((o) =>
{
for (int i = 0; i < 20; i++)
{
bool isNetworkUp = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
Console.WriteLine($"Is network available? Answer: {isNetworkUp}");
Thread.Sleep(100);
}
});
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Main thread working...");
Task.Delay(500);
}
Console.WriteLine("Done");
Console.ReadKey();
ในตัวอย่างนี้ เราใช้ ThreadPool.QueueUserWorkItem เพื่อดำเนินการงานในเบื้องหลัง ขณะที่เธรดหลักยังคงทำงานต่อไป
การใช้เธรดและไทม์เมอร์ (Threading and Timers)
.NET มีคลาสไทม์เมอร์ที่ใช้ ThreadPool สองตัวที่ปลอดภัยต่อการใช้งานและสามารถใช้งานได้บนทุกแพลตฟอร์มที่ .NET 6 รองรับ ได้แก่ System.Timers.Timer และ System.Threading.Timer
ตัวอย่างการใช้ System.Timers.Timer
private System.Timers.Timer? _timer;
private void InitializeTimer()
{
_timer = new System.Timers.Timer
{
Interval = 1000
};
_timer.Elapsed += _timer_Elapsed;
}
private void _timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
int messageCount = CheckForNewMessageCount();
if (messageCount > 0)
{
AlertUser(messageCount);
}
}
public void StartTimer()
{
if (_timer == null)
{
InitializeTimer();
}
if (_timer != null && !_timer.Enabled)
{
_timer.Enabled = true;
}
}
public void StopTimer()
{
if (_timer != null && _timer.Enabled)
{
_timer.Enabled = false;
}
}
โค้ดข้างต้นเป็นตัวอย่างการใช้งาน System.Timers.Timer ในการตรวจสอบข้อความใหม่และแจ้งเตือนผู้ใช้หากพบข้อความใหม่ โดยเริ่มต้นและหยุดไทม์เมอร์ด้วยการตั้งค่า property Enabled ของ _timer