Task, async/await với Winform CSahrp

Hướng dẫn Task, async/await với Winform CSahrp

Dùng Task + async/await khi

Gọi API / đọc file lớn
Truy vấn database lâu
Tính toán nặng
Không muốn treo UI

Một số ví dụ ứng dụng Task + async/await

🎯 Ví dụ 1: Giả lập truy vấn database lâu (WinForms)

private void btnLoad_Click(object sender, EventArgs e)
{
    Thread.Sleep(5000); // Giả lập query lâu
    MessageBox.Show("Xong");
}

👉 Form sẽ đơ 5 giây.

Thực tế đợi lâu, làm giao diện winform bị đơ

  DateTime t1 = DateTime.Now;

  Random rd = new Random();

  DataSet ds = new DataSet();
  DataTable dt = new DataTable();
  dt.Columns.Add("A", typeof(int));
  dt.Columns.Add("B", typeof(int));

  int tog = 7000000;

  for (int i = 1; i <= tog; i++)
  {
      dt.Rows.Add(rd.Next(1, 101), rd.Next(1, 500));
  }

  ds.Tables.Add(dt);
  DateTime t2 = DateTime.Now;
  TimeSpan tg = t2 - t1;

  MessageBox.Show("Tạo được "+ tog.ToString("n0") 
      +", Thời gian: " + tg.TotalSeconds.ToString("N2") + " giây");

✅ Cách đúng (async/await)

private async void btnLoad_Click(object sender, EventArgs e)
{
    btnLoad.Enabled = false;
    lblStatus.Text = "Đang tải...";

    await Task.Run(() =>
    {
        Thread.Sleep(5000); // Giả lập xử lý lâu
    });

    lblStatus.Text = "Hoàn tất!";
    btnLoad.Enabled = true;
}


📌 Điều hay:

UI không bị treo
Không cần tạo Thread
Code rất sạch

🎯 Ví dụ 2: Đọc file lớn

using System.IO;
using System.Threading.Tasks;
private async void btnRead_Click(object sender, EventArgs e)
{
    string content = await File.ReadAllTextAsync("data.txt");
    txtResult.Text = content;
}

🎯

Ví dụ 3: Load DataGridView từ database (mô phỏng)

private async void btnLoad_Click(object sender, EventArgs e)
{
    lblStatus.Text = "Đang tải dữ liệu...";

    DataTable dt = await Task.Run(() =>
    {
        DataTable table = new DataTable();
        table.Columns.Add("Ma");
        table.Columns.Add("Ten");

        // Giả lập xử lý lâu
        Thread.Sleep(3000);

        table.Rows.Add("SP01", "iPhone");
        table.Rows.Add("SP02", "Samsung");

        return table;
    });

    dataGridView1.DataSource = dt;
    lblStatus.Text = "Xong";
}

🎯 Ví dụ 4: Chạy nhiều Task song song

private async void btnRun_Click(object sender, EventArgs e)
{
    var t1 = Task.Run(() =>
    {
        Thread.Sleep(3000);
        return "Xong 1";
    });

    var t2 = Task.Run(() =>
    {
        Thread.Sleep(2000);
        return "Xong 2";
    });

    string[] results = await Task.WhenAll(t1, t2);

    MessageBox.Show(string.Join(" - ", results));
}

Một số kinh nghiệm về async/await C#

async/await KHÔNG tạo thread mới.
Task.Run() → chạy trên ThreadPool
await → không chặn UI
Sau await → tự quay lại UI thread

📌 Khi nào KHÔNG dùng Task.Run?

Nếu là I/O như:ReadAllTextAsync
SqlCommand.ExecuteReaderAsync

HttpClient.GetAsync

👉 Chỉ cần await trực tiếp, không cần Task.Run

Hướng dẫn Task, async/await với Winform CSahrp