- [DEVEXPRESS] Hỗ trợ tìm kiếm highlight không dấu và không khoảng cách trên Gridview Filter
- [C#] Chia sẻ source code phần mềm Image Downloader tải hàng loạt hình ảnh từ danh sách link url
- [C#] Chụp hình và quay video từ camera trên winform
- [C#] Chia sẽ full source code tách file Pdf thành nhiều file với các tùy chọn
- Giới thiệu về Stock Tracker Widget - Công cụ theo dõi cổ phiếu và cảnh báo giá tăng giảm bằng C# và WPF
- [VB.NET] Chia sẻ công cụ nhập số tiền tự động định dạng tiền tệ Việt Nam
- [VB.NET] Hướng dẫn fill dữ liệu từ winform vào Microsoft word
- [VB.NET] Hướng dẫn chọn nhiều dòng trên Datagridview
- Hướng Dẫn Đăng Nhập Nhiều Tài Khoản Zalo Trên Máy Tính Cực Kỳ Đơn Giản
- [C#] Chia sẻ source code phần mềm đếm số trang tập tin file PDF
- [C#] Cách Sử Dụng DeviceId trong C# Để Tạo Khóa Cho Ứng Dụng
- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [C#] Hướng dẫn download file từ Minio Server 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!

![[C#] Invoke là gì? cách sử dụng phương thức Invoke()](https://laptrinhvb.net/uploads/users/9a8cb514e4428e85fb4ca07588e9103f.png)


![[C# - VB.NET] Hướng dẫn sử dụng Bing Translator API dịch các tiếng việt sang tiếng anh](https://laptrinhvb.net/uploads/source/image_baiviet/86527fd8629a528ede94e9c9ead7ce6b.jpg)
![[C#] Hướng dẫn thêm text vào hình ảnh icon winform](https://laptrinhvb.net/uploads/source/vbnet/icon_progress.gif)
![[C#] Hướng dẫn lập trình gởi tin nhắn, lấy số điện thoại, kiểm tra tài khoản và nạp tiền vào điện thoại sử dụng GMS Modem hoặc USB 3G](https://laptrinhvb.net/uploads/source/csharp/send_sms_thumb.jpg)
![[C#] Rút gọn đường dẫn link url với TinyURL API](https://laptrinhvb.net/uploads/source/csharp/short_link_url_csharp.png)
![[C#] Hướng dẫn lưu danh sách hình ảnh dạng file nhị phân](https://laptrinhvb.net/uploads/source/vbnet/image_thumb.png)
![[C#] Làm việc với Microsoft PowerPoint file template trong Winform](https://laptrinhvb.net/uploads/source/csharp/power_point_thumb.png)
![[C#] Giải pháp thay thế Web Browser Control mặc định bằng Awesomium của bộ Visual Studio](https://laptrinhvb.net/uploads/source/image_baiviet/0ddd54d36f9c30418c8465205ee441d2.png)
![[C#] Kiểm tra thiết bị USB có đang gắn trong máy tính hay không](https://laptrinhvb.net/uploads/source/image_baiviet/d7f891d4fcabcf89b8b85d284b993ae2.jpg)
![[C#] Hướng dẫn cách vẽ đường thẳng trên Winform](https://laptrinhvb.net/uploads/source/DATABASE/bevel-line.png)

![[C#] Hướng dẫn tạo Overlay Modal Dialog Winform](https://laptrinhvb.net/uploads/source/image_baiviet/f99ba6ed4eed481f29cd9ac4f44d0ade.jpg)
![[C#] Chia sẻ code lock và unlock user trong domain Window](https://laptrinhvb.net/uploads/source/new_image_baiviet/lock_unlock_user_domain.png)
![[C#] Hướng dẫn sử dụng Richtextbox Autocomplete Intellisense giống tag friends của  facebook](https://laptrinhvb.net/uploads/source/image_baiviet/454f7f88516ab088ccd3640275eec4f6.jpg)
![[C#] Hướng dẫn scan multi QRCode, Barcode Realtime sử dụng Zxing.Net và AForge](https://laptrinhvb.net/uploads/source/csharp/scan_qrcode_csharp_thumb.png)
![[C#] Vì Mẹ anh bắt phải Fake địa chỉ MacAddress](https://laptrinhvb.net/uploads/source/new_image_baiviet/dia_chi_macaddress.jpg)
![[C#] Hướng dẫn viết ứng dụng Fake IP (ẩn IP) sử dụng HttpRequest trong lập trình csharp](https://laptrinhvb.net/uploads/source/csharp/fake_ip_thumb.jpg)
![[C#] Mã hóa văn bản sử dụng thuật toán XOR](https://laptrinhvb.net/uploads/source/vbnet/xor_encrypt_decrypt_csharp.gif)
![[BUNIFU FRAMEWORK] Hướng dẫn viết ứng dụng đếm ngược thời gian (Count Down Timer) C#](https://laptrinhvb.net/uploads/source/image_baiviet/de7ea89752f88e36aa425f560dfd8f97.png)
![[C#] Hướng dẫn lập lịch tự động Task Schedule trong Windows](https://laptrinhvb.net/uploads/source/csharp/Task_Schedule_thumb.png)
![[C#] Đăng nhập login phần mềm bằng tài khoản Domain Controller](https://laptrinhvb.net/uploads/source/new_image_baiviet/login_account_domain.png)
![[C#] Giới thiệu thư viện Guna Framework dùng thiết kế giao diện winform hiện đại](https://laptrinhvb.net/uploads/source/csharp/guna_framework_csharp_demo.gif)
![[C#] Hướng dẫn tạo conner circle image trong PictureBox](https://laptrinhvb.net/uploads/source/image_baiviet/613ad6f17ba95c200a12826e9c2cdcaf.jpg)
![[C#] Hướng dẫn khởi động lại Retart process trên winform](https://laptrinhvb.net/uploads/source/new_image_baiviet/retart_process_in_csharp.png)
![[C#] Hướng dẫn Khóa và mở khóa Folder](https://laptrinhvb.net/uploads/source/vbnet/LOCK_FOLDER_THUMB.png)
