跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有。在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理。因此,当没有使用委托机制而是直接在子线程中修改控件内容时,会引发控件安全问题,即跨线程访问控件问题。
所谓跨线程调用控件就是一个线程调用另外一个线程的控件。
常见使用情况,比如:当我们开了一个在后台监听消息的线程以后,需要将消息内容添加到主窗体的消息框内显示出来。
这时候,我们就需要使用跨线程调用控件的方法。
1.首先,声明一个委托,如:
//修饰符 delegate 返回类型 委托函数名(有参/无参);
public delegate void AddInfo_Delgegate(string message);
2.创建委托函数对象,如:
//添加消息到指定控件的函数
private void AddInfo(string message)
{
this.richTextBox_Message.Text += message;
this.richTextBox_Message.Text += "
";//换行
}
AddInfo_Delegate addinfo = new AddInfo_Delegate(AddInfo);
3.在需要跨线程调用空间的地方,使用invoke方法:
this.richTextBox_Message.Invoke(addinfoDelegate, DELEGATEMESSAGE);
//this.richTextBox_Message 是需要添加消息的控件
//invoke() 正如官方解释所说,在拥有此控件的线程上,调用指定参数列表执行委托。
//invoke() 有两种参数模式,一是invoke(委托函数对象),二是带参类型invoke(委托函数对象,参数)
---------------------
作者:linyujie0927
来源:CSDN
原文:https://blog.csdn.net/linyujie0927/article/details/72083227
版权声明:本文为博主原创文章,转载请附上博文链接!