- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
[C#] Invoke là gì? cách sử dụng phương thức Invoke()
Xin chào các bạn, bài viết hôm nay mình sẻ tiếp tục hướng dẫn các bạn về Invoke trong lập trình C#, Winform.
Khi các bạn lập trình bất động bộ, sử dụng Task, thì các bạn thường hay gặp về phương thức Invoke.
Vậy Invoke C# là gì?
Khi ứng dụng của bạn chạy, có một thread được tạo ra để chạy hàm Main().
Ở trên hàm Main() có [STAThread]
Đó là thread chính (main-thread).
Nếu chương trình của bạn có nhiều thread thực hiện các tác vụ xử lý khác và các thread này cần sử dụng tài nguyên từ thread chính thì bạn phải cần tới Invoke.
Thực ra, bạn có thể đặt thuộc tính CheckForIllegalCrossThreadCalls = false; cho form (hoặc control) và sử dụng các tài nguyên từ thread khác một cách thoải mái.
Nhưng như vậy, chương trình của bạn sẽ rơi vào trạng thái ko an toàn (unsafe) và sẽ bị crash bất cứ lúc nào khi mà các thread tranh chấp tài nguyên với nhau.
C# cung cấp 1 giải pháp an toàn hơn đó là Invoke. Khi bạn gọi phương thức này của 1 form (hoặc control) từ 1 thread khác, form (control) đó sẽ bị lock, chỉ cho phép thread đã gọi nó truy cập. Khi thread này hoàn thành tác vụ của nó, form (control) lại được giải phóng cho thread khác gọi.
Như vậy, các thread sẽ được đồng bộ với nhau và chương trình của bạn sẽ ko bị crash. Đó gọi là thread-safe.
Có những control ko yêu cầu Invoke để thực hiện thread-safe. Nghĩa là nó có thể được truy cập một cách trực tiếp ko qua Invoke.
Thuộc tính InvokeRequired sẽ cho biết một control có yêu cầu Invoke khi gọi hay ko ?
- Khi gọi Invoke, bạn phải truyền cho nó 1 delegate. Bạn có thể sử dụng delegate MethodInvoker có sẵn của C#.
- VD : Chương trình của mình có 1 listbox, mình sẽ tạo 1 thread mới.
Thread này có nhiệm vụ thêm các số từ 1-9999 vào listbox, đồng thời cập nhật tiến độ qua 1 progressbar.
private void btnCreateNumber_Click(object sender, EventArgs e)
{
lstNumber.Items.Clear();
// Tạo và chạy thread
Thread thrGenerating = new Thread(new ThreadStart(DoWork));
thrGenerating.Start();
}
private void DoWork()
{
for (int i = 1; i <= 9999; i++)
{
// Thêm item vào list qua invoke
lstNumber.Invoke(new Action(()=>
{
lstNumber.Items.Add(i);
lstNumber.TopIndex = lstNumber.Items.Count - 1;
}));
// Cập nhật tiến độ qua progress bar
pgrOperation.Invoke(new Action(() =>
{
pgrOperation.Value = (i * 100 / 9999);
}));
}
MessageBox.Show("Finish!");
}
Thanks for watching!