线程间操作无效: 从不是创建控件(对 Windows 窗体控件进行线程安全调用)

本文介绍如何在Windows Form应用中实现线程安全地调用ListBox控件的方法。通过检查控件的InvokeRequired属性,判断是否需要跨线程调用,并使用委托和Invoke方法确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对 Windows 窗体控件进行线程安全调用

  1. 查询控件的 InvokeRequired 属性。

  2. 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。

  3. 如果 InvokeRequired 返回 false,则直接调用控件。

**********************************************************************************

一个WinFrom界面上一个ListBox控件,通过线程来对该控件进行操作。

   private void button13_Click(object sender, EventArgs e)
        {
            ThreadWithData tws = new ThreadWithData(this.listBox5);
            Thread t = new Thread(new ThreadStart(tws.ThreadProc));
            t.Start();
        }

 

下面是ThreadWithData类

   

public class ThreadWithData
    {
        ListBox liBx;
        public ThreadWithData(ListBox LBX)
        {
            liBx = LBX;
        }

        delegate void SetListBoxCallback();   //定义委托
        public void ThreadProc()
        {
            Thread.Sleep(5000);
            if (liBx.InvokeRequired)//控件是否跨线程?如果是,则执行括号里代码
            {
                SetListBoxCallback setListCallback = new SetListBoxCallback(ThreadProc);   //实例化委托对象
                liBx.Invoke(setListCallback);   //重新调用SetListBox函数            
            }
            else //否则,即是本线程的控件,控件直接操作
            {
                liBx.Items.Add("线程调用");
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值