Bài 1: Giới thiệu về Trình quản lý quảng cáo

BÀI 10: XỬ LÝ NGOẠI LỆ, ĐA LUỒNG VÀ BẤT ĐỒNG BỘ TRONG C#

📌 PHẦN 1: XỬ LÝ NGOẠI LỆ (EXCEPTION HANDLING)

🔎 1. Ngoại lệ là gì?

  • Là các lỗi xảy ra khi chương trình đang chạy (runtime)

  • Ví dụ: chia cho 0, đọc file không tồn tại, dữ liệu không hợp lệ...

⚙️ 2. Cấu trúc try-catch-finally

try
{
    // Code có thể gây lỗi
}
catch (Exception ex)
{
    // Xử lý lỗi
}
finally
{
    // Luôn được thực thi (dọn dẹp tài nguyên, đóng file...)
}

📚 3. Một số loại ngoại lệ thường gặp

Ngoại lệ Mô tả
DivideByZeroException Chia cho 0
NullReferenceException Gọi thuộc tính/phương thức của null
FormatException Sai định dạng dữ liệu
FileNotFoundException Không tìm thấy file

✨ 4. Tự tạo ngoại lệ với throw

if (diem < 0 || diem > 10)
    throw new ArgumentOutOfRangeException("Điểm không hợp lệ");

   📌 PHẦN 2: LẬP TRÌNH ĐA LUỒNG (MULTITHREADING)

🔍 1. Đa luồng là gì?

  • Là cách chạy song song nhiều tác vụ trong chương trình

  • Dùng khi:

    • Làm nhiều việc cùng lúc (nền + chính)

    • Chạy các tác vụ nặng (ví dụ: tính toán, tải dữ liệu) không chặn UI

🧩 2. Tạo và chạy một luồng

using System.Threading;

Thread t = new Thread(() =>
{
    for (int i = 1; i <= 5; i++)
    {
        Console.WriteLine("Luồng phụ: " + i);
        Thread.Sleep(1000);
    }
});
t.Start();

// Luồng chính vẫn chạy song song
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine("Luồng chính: " + i);
    Thread.Sleep(1000);
}

💡 Ghi nhớ:

  • Dùng Thread.Sleep(ms) để "ngủ" trong vài mili-giây

  • Start() để bắt đầu luồng

  • Hai luồng chạy song song, kết quả in ra sẽ xen kẽ

🎯 3. Ứng dụng thực tế của đa luồng

  • Làm thanh tiến trình (progress bar)

  • Tải dữ liệu trong nền

  • Chạy đồng thời nhiều công việc (ví dụ: kiểm tra file, nén, ghi log…)


📌 PHẦN 3: LẬP TRÌNH BẤT ĐỒNG BỘ (ASYNC / AWAIT)

🔍 1. Bất đồng bộ là gì?

  • Thay vì "chờ xong rồi mới làm tiếp", chương trình tiếp tục chạy, và quay lại khi xong

  • Cần dùng khi:

    • Đọc/ghi file

    • Gọi API

    • Xử lý mạng

🧩 2. Hàm bất đồng bộ với async/await

public async Task DocFileAsync()
{
    Console.WriteLine("Bắt đầu đọc file...");
    string content = await File.ReadAllTextAsync("data.txt");
    Console.WriteLine("Nội dung: " + content);
}

🧪 3. Gọi hàm async từ Main

static async Task Main(string[] args)
{
    await DocFileAsync();
}

🔍 So sánh: Đa luồng (Multithreading) vs. Bất đồng bộ (Async/Await)

Tiêu chí Đa luồng (Multithreading) Bất đồng bộ (Async/Await)
Cơ chế hoạt động Tạo ra nhiều luồng để chạy song song Một luồng chính nhưng tạm "nhường" việc cho các tác vụ chờ
Sử dụng CPU Mỗi luồng chiếm riêng CPU, chạy song song thật Một luồng chính, nhưng không chặn trong lúc đợi (IO, mạng, file...)
Phù hợp cho Công việc nặng, tính toán nhiều Công việc chờ: đọc file, gọi API, truy vấn DB
Quản lý phức tạp Khó quản lý, dễ lỗi nếu không đồng bộ dữ liệu Dễ viết, dễ đọc, ít lỗi hơn
Cú pháp Thread, Task, ThreadPool async, await
Ứng dụng điển hình Tính toán lớn, game, AI, render App đọc dữ liệu từ web, đọc file không chặn UI
Hiệu suất Tốt với CPU-bound Tốt với IO-bound

✅ Gợi ý khi nào dùng cái nào:

  • Nếu công việc là chờ (gọi API, đọc file): → Dùng async/await

  • Nếu công việc cần tính toán song song: → Dùng đa luồng


Anh Phương có muốn mình tích hợp phần so sánh này vào bài giảng Bài 10 định dạng Word hoặc PowerPoint để tiện trình bày không? Mình có thể tạo ngay.