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
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;
}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;
}🎯
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";
}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));
}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