C# 关于跨线程访问控件问题

跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有。在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理。因此,当没有使用委托机制而是直接在子线程中修改控件内容时,会引发控件安全问题,即跨线程访问控件问题。


所谓跨线程调用控件就是一个线程调用另外一个线程的控件。


常见使用情况,比如:当我们开了一个在后台监听消息的线程以后,需要将消息内容添加到主窗体的消息框内显示出来。


这时候,我们就需要使用跨线程调用控件的方法。


1.首先,声明一个委托,如:

//修饰符 delegate 返回类型 委托函数名(有参/无参);
public delegate void AddInfo_Delgegate(string message);

2.创建委托函数对象,如:

//添加消息到指定控件的函数
private void AddInfo(string message)
        {
            this.richTextBox_Message.Text += message;
            this.richTextBox_Message.Text += "\r\n";//换行   
        }

AddInfo_Delegate addinfo = new AddInfo_Delegate(AddInfo);

3.在需要跨线程调用空间的地方,使用invoke方法:

this.richTextBox_Message.Invoke(addinfoDelegate, DELEGATEMESSAGE);
//this.richTextBox_Message 是需要添加消息的控件
//invoke() 正如官方解释所说,在拥有此控件的线程上,调用指定参数列表执行委托。
//invoke() 有两种参数模式,一是invoke(委托函数对象),二是带参类型invoke(委托函数对象,参数) 

总结,这是第一次分享经验,表达地不是很清楚,多多指教。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页