การจัดการเธรดพูล (Managed Thread Pool)

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