多线程WinForm(C#.NET)程序修改窗体控件
问题描述
在winform程序中,常要开些线程来操作业务,比如开个tcplistener监听socket等等,然后把接收到的信息显示在richtextbox中。
然而,如果你开一个线程来监听,那么这个线程不能直接调用form中的richtextbox,因为form有自己的线程,.NET出于安全考虑禁止跨线程调用控件。
解决方案
在窗体类的命名空间中添加一个委托,定义如下,其中参数txt是添加进richtextbox的文本,newline指需不需要换行
public delegate void AppendResultTextHandler(string txt,bool newline);
之后,在窗体类内部添加一个成员变量
AppendResultTextHandler artHandler = null;
并在窗体加载事件中对其初始化
private void MainForm_Load(object sender, EventArgs e) { artHandler = new AppendResultTextHandler(AppendResultText); }
之后就要写出委托的这个AppendResultText方法了,因为定义委托时使用的参数为(string txt,bool newline),很显然要写的就是:AppendResultText(string txt,bool newline);
public void AppendResultText(string txt, bool newline) { if (this.rtbresult.InvokeRequired) { //调用方在另外一个线程中 //在拥有此控件的线程上执行委托指向的方法 this.rtbresult.Invoke(artHandler,txt,newline); } else { //调用方在当前线程中 this.rtbresult.AppendText(txt);//增加文本 if (newline) { rtbresult.AppendText(Environment.NewLine);//换行 } this.rtbresult.ScrollToCaret();//滚动到当前目录 }
}
这样,其他线程就可以通过AppendResultText()方法修改rtbresult的文本了。当然,其他的属性也可以咯。

浙公网安备 33010602011771号