Lập trình đa luồng trong C# – Phần 10

Đăng ngày: 20/06/2026 • Tác giả: Quản trị viên
Lập trình đa luồng trong C# – Phần 10

 

Lập trình đa luồng trong C# – Phần 10

1. Đa luồng (Multithreading) trong C# là gì?

Đa luồng là kỹ thuật giúp chương trình thực thi nhiều tác vụ cùng lúc, giúp tăng hiệu suất và tối ưu hóa tài nguyên CPU.

💡 Ví dụ thực tế:

  • Khi tải một trang web, trình duyệt có thể tải hình ảnh và văn bản song song.
  • Một ứng dụng có thể xử lý file lớn trong khi vẫn phản hồi giao diện người dùng.

2. Tạo luồng đơn giản trong C#

Trong C#, bạn có thể tạo luồng mới bằng Thread.

using System;
using System.Threading;

class Program
{
    static void PrintMessage()
    {
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine($"Luồng phụ: {i}");
            Thread.Sleep(1000); // Dừng 1 giây
        }
    }

    static void Main()
    {
        Thread thread = new Thread(PrintMessage);
        thread.Start(); // Khởi động luồng

        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine($"Luồng chính: {i}");
            Thread.Sleep(1000);
        }
    }
}

⏳ Kết quả (có thể thay đổi tùy vào hệ thống):

Luồng chính: 1
Luồng phụ: 1
Luồng chính: 2
Luồng phụ: 2
...

📌 Giải thích:

  • Thread.Sleep(1000); giúp chương trình dừng 1 giây trước khi tiếp tục.
  • thread.Start(); khởi chạy luồng mới song song với luồng chính.

3. Đồng bộ hóa luồng (Join)

Để chờ một luồng kết thúc trước khi tiếp tục, sử dụng Join().

static void PrintMessage()
{
    for (int i = 1; i <= 3; i++)
    {
        Console.WriteLine($"Luồng phụ: {i}");
        Thread.Sleep(1000);
    }
}

static void Main()
{
    Thread thread = new Thread(PrintMessage);
    thread.Start();
    thread.Join(); // Chờ luồng phụ kết thúc

    Console.WriteLine("Luồng chính tiếp tục...");
}

⏳ Kết quả:

Luồng phụ: 1
Luồng phụ: 2
Luồng phụ: 3
Luồng chính tiếp tục...

📌 Lợi ích:

  • Đảm bảo luồng phụ hoàn thành trước khi thực hiện tiếp phần còn lại của chương trình.

4. Truyền tham số vào luồng

Bạn có thể truyền dữ liệu vào luồng bằng ParameterizedThreadStart.

static void PrintMessage(object message)
{
    for (int i = 1; i <= 3; i++)
    {
        Console.WriteLine($"{message}: {i}");
        Thread.Sleep(1000);
    }
}

static void Main()
{
    Thread thread = new Thread(PrintMessage);
    thread.Start("Luồng phụ"); // Truyền tham số
}

⏳ Kết quả:

Luồng phụ: 1
Luồng phụ: 2
Luồng phụ: 3

📌 Lưu ý:

  • object message giúp truyền tham số dạng bất kỳ.
  • Nếu cần truyền nhiều tham số, nên dùng lambda expressions hoặc Task (sẽ học ở phần sau).

5. Quản lý trạng thái luồng (IsAlive)

Bạn có thể kiểm tra xem luồng còn chạy hay không bằng IsAlive.

Thread thread = new Thread(PrintMessage);
thread.Start();

while (thread.IsAlive)
{
    Console.WriteLine("Luồng phụ đang chạy...");
    Thread.Sleep(500);
}

Console.WriteLine("Luồng phụ đã kết thúc!");

6. Dừng luồng (Abort không còn được khuyến nghị)

Cách tốt nhất để dừng luồng là sử dụng biến cờ (flag).

class Program
{
    static bool isRunning = true;

    static void PrintMessage()
    {
        while (isRunning)
        {
            Console.WriteLine("Luồng đang chạy...");
            Thread.Sleep(1000);
        }
        Console.WriteLine("Luồng đã dừng!");
    }

    static void Main()
    {
        Thread thread = new Thread(PrintMessage);
        thread.Start();

        Console.WriteLine("Nhấn phím bất kỳ để dừng luồng...");
        Console.ReadKey();
        isRunning = false; // Dừng luồng
    }
}

📌 Lưu ý:

  • Thread.Abort() đã bị loại bỏ từ .NET Core trở đi.

7. Lập trình đa luồng với Task (Thay thế Thread)

Task là cách hiện đại hơn để xử lý đa luồng.

using System;
using System.Threading.Tasks;

class Program
{
    static async Task PrintMessage()
    {
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine($"Task đang chạy: {i}");
            await Task.Delay(1000);
        }
    }

    static async Task Main()
    {
        Task task = PrintMessage();
        await task; // Chờ task hoàn thành

        Console.WriteLine("Chương trình kết thúc!");
    }
}

📌 Ưu điểm của Task so với Thread:
✅ Dễ quản lý hơn với async/await.
✅ Tự động tối ưu theo số lượng CPU.
✅ Tương thích tốt với lập trình bất đồng bộ (async programming).

8. Tóm tắt bài học

✅ Đa luồng giúp chương trình chạy nhanh hơn bằng cách thực hiện nhiều tác vụ song song.
✅ Dùng Thread để tạo luồng mới.
✅ Dùng Join() để chờ luồng kết thúc.
✅ Dùng IsAlive để kiểm tra trạng thái luồng.
✅ Dùng Task thay vì Thread để lập trình đa luồng hiện đại.

💡 Bài tiếp theo:
👉 Lập trình bất đồng bộ với async/await trong C# – Phần 11 🚀

Bài viết liên quan