[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 những bạn lập trình bất động bộ, sử dụng Task, thì những bạn thường hay gặp về phương pháp 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]

thead_main

Đó là thread chính (main-thread).

Nếu chương trình của bạn có nhiều thread thực thi những tác vụ giải quyết và xử lý khác và những 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ó trách nhiệm thêm những số từ 1-9999 vào listbox, đồng thời update quá trình 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 !

THÔNG TIN TÁC GIẢ

Founder
Founder
1049 bài viết
7,835,948

NGUYỄN THẢO

Founder at LaptrinhVB.net

★★★★★

♥ Tình yêu thương chẳng hề hư mất khi nào. ( Cr 13,4 )

=========================================================================

My skills includes. NET ( C #, VB.NET ), DevExpress, Java, Android, PHP ,
Python, Sqlserver, Mysql, Reactjs, Dart, Flutter, API services and lot more …

Phone/Zalo/Telegram/WhatsApp: +84.933.913.122

E-Mail : nguyenthao.laptrinhvb@gmail.com
Facebook : https://fb.com/Lewandowski28031988
Youtube Channel : https://www.youtube.com/c/CTutorialsTips

beer

Buy me a cup of beer

momo_nt        zalopay_image

buy_a_coffee

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

 

BÀI VIẾT LIÊN QUAN

5/5 - (1 vote)

Bài viết liên quan

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments