多线程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的文本了。当然,其他的属性也可以咯。

 

 

posted @ 2013-03-26 10:58  苍云古齿  阅读(1110)  评论(0)    收藏  举报