- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
- Hướng dẫn khóa file bằng nhiều process id, không cho xóa tập tin
- Hướng dẫn cách tạo Product Id cho ứng dụng phần mềm XXXXX-XXXXX-XXXXX-XXXXX
- [SQLSERVER] Hướng dẫn tạo script sql từ ứng dụng Sqlserver management Studio
- [C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform
- [VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator
- [C#] Sử dụng thư viện Polly gửi lại request api khi request bị lỗi hay rớt mạng
- [DEVEXPRESS] Chia sẻ source code tạo báo cáo report in tem nhãn label trên C# winform
- [DEVEXPRESS] Hướng dẫn vẽ biểu đồ Bar Chart trên Winform
- [C#] Tạo form đăng nhập và đăng ký với hiệu ứng Sliding Animation Effect
- [C#] Hướng dẫn tạo thanh toán đơn hàng qua mã vạch VietQR sử dụng API PayOS hoàn toàn miễn phí
- [C#] Hướng dẫn ghi log ra RichTextBox giống Console trên Winform sử dụng thư viện Serilog
- [C#] Hướng dẫn cách tạo mã QR Code trên file Excel
- [VB.NET] Gởi tin nhắn và file đính kèm qua ứng dụng gởi tin nhắn Whats App
- [C#] Viết ứng dụng Auto Fill list Textbox from clipboard Winform
- [TOOL] Chia sẻ phần mềm thay đổi thông tin cấu hình máy tính
- [C#] Hướng dẫn Export dữ liệu ra file Microsoft Word Template
- [C#] Chia sẻ source code tool kiểm tra domain website
[C#] Hướng dẫn lập trình đa luồng sử dụng Task
Trong phiên bản .NET framework 4.0, Microsoft đã bổ sung nhiều thư viện hỗ trợ việc xử lý đa luồng (multi-threading), nhằm đơn giản hóa việc lập trình lẫn hiệu suất của chương trình.
[C#] Hướng dẫn lập trình đa luồng sử dụng Task
Trong bài viết này, tôi xin hướng dẫn các bạn sử dụng lớp System.Threading.Task.
Task
- Định nghĩa các công việc tiếp theo, được làm sau khi 1 task khác kết thúc. Công việc có thể khác khi công việc trước đó thực thi thành công hay thất bại.
- Nhận được kết quả trả từ một luồng khác.
- Kiểm soát lỗi tốt hơn.
- Dễ dàng chờ đợi 1 hay nhiều Task thực thi xong.
Tạo một Task (công việc)
Task.Factory.StartNew(() => DoSomeWork);
Cách 2:
var action = new Action(DoSomeWork);
var task = new Task(action);
task.Start();
Thực hiện Task liên tiếp
static void Example2()
{
var t1 = new Task(DoOnFirst);
var t2 = t1.ContinueWith(DoOnSecond);
t1.Start();
}
static void DoOnFirst()
{
Console.WriteLine("doing some task {0}", Task.CurrentId);
Thread.Sleep(3000);
}
static void DoOnSecond(Task t)
{
Console.WriteLine("task {0} finished", t.Id);
Console.WriteLine("this task id {0}", Task.CurrentId);
Console.WriteLine("do some cleanup");
Thread.Sleep(3000);
}
static void Example3()
{
var t1 = new Task(DoOnFirst);
var t2 = t1.ContinueWith(DoOnSecond);
var t3 = t2.ContinueWith(DoOnThird, TaskContinuationOptions.OnlyOnFaulted);
t1.Start();
}
static void DoOnSecond(Task t)
{
Console.WriteLine("task {0} finished", t.Id);
Console.WriteLine("this task id {0}", Task.CurrentId);
Console.WriteLine("do some cleanup");
Thread.Sleep(3000);
throw new Exception("Failed");
}
static void DoOnThird(Task t)
{
Console.WriteLine("task {0} failed", t.Id);
Console.WriteLine("this task id {0}", Task.CurrentId);
}
Nhận kết quả trả về từ Task
static void Example41()
{
var task = Task.Factory.StartNew(delegate
{
DoSomeWork();
return 2712;
});
Console.WriteLine(task.Result);
}
static void Example42()
{
var task = Task.Factory.StartNew((Func<int>)DoSomeWork1);
Console.WriteLine(task.Result);
}
static void Example43()
{
var task = Task<int>.Factory.StartNew(DoSomeWork1);
Console.WriteLine(task.Result);
}
static int DoSomeWork1()
{
DoSomeWork();
return 2712;
}
Chờ đợi 1 (hoặc nhiều) Task
static void Example51()
{
var task = Task.Factory.StartNew(()=>
{
DoSomeWork();
Console.WriteLine("Complete");
});
task.Wait();
}
Để chờ đợi nhiều Task thực thi xong, bạn gọi hàm Task.WaitAll(Task[]).
static void Example52()
{
var task1 = Task.Factory.StartNew(DoSomeWork);
var task2 = Task.Factory.StartNew(DoSomeWork);
Task.WaitAll(task1, task2);
}