欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现跨线程操作控件方法

程序员文章站 2023-12-16 09:54:04
本文实例讲述了c#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下: 由于在.net平台下winform、wpf禁止跨线程直接访问控件,因此在必须跨线程访问...

本文实例讲述了c#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下:

由于在.net平台下winform、wpf禁止跨线程直接访问控件,因此在必须跨线程访问控件的时候采用异步方式。

1、winform项目中跨线程访问控件:

编写一个winform小实例:在做winform项目中,有时为了将系统运行的状态实时显示到form中,因此添加一个richtextbox控件实时显示系统运行日志。本例实现的操作是将日志以字符串的形式写入richtextbox控件,因为是实时显示,所以涉及到跨线程输入的问题。

复制代码 代码如下:
private delegate void setrichtexbox(string s);
public void settext(string txt)
{
    if (this.t_revmsg.invokerequired)//等待异步
    {
 setrichtexbox fc = new setrichtexbox(set);
 this.invoke(fc, new object []{ txt});
    }
    else
    {
 this.t_revmsg.appendtext(txt);
    }
}

private void set(string txt)
{
    t_revmsg.appendtext(txt);
}

控件的invokerequired的值为true时,说明有一个不属于创建它的线程要访问它,此时需要采用异步的方式进行操作。

2、wpf项目中跨线程访问控件:

wpf的page页中,加入一个button控件和textbox控件,点击button实现添加textbox控件中的内容。

复制代码 代码如下:
private void button2_click(object sender, routedeventargs e)
{
    this.textbox1.dispatcher.invoke(new writedelegate(writemethod), "asdf");
}

private delegate void writedelegate(string str);
private void writemethod(string str)
{
    this.textbox1.appendtext(str);

}

3、wpf项目中跨线程获取textbox控件中的内容

本实例实现的功能是:点击button控件,开启socket监听服务。监听的端口需要从ui界面中的textbox中获取,因为不是创建它的线程访问它,因此才有dispatcher.invoke异步操作。稍作补充:在开启监听的过程中,有while(true)死循环,将其直接放入到主线程都会导致线程无法正常进行下去,解决方法是开启一个新的线程来开启监听。

复制代码 代码如下:
private void button1_click(object sender, routedeventargs e)
{
    thread thread = new thread(new threadstart(startserver));
    thread.start();
}

public void startserver()
{
    int port = convert.toint32(gettext(this.tbport));
    serversocket serversocket = new serversocket(port);
    serversocket.start();
}

private delegate string gettexthandle(control control);
private string gettext(control control)
{
    if (this.dispatcher.thread != system.threading.thread.currentthread)
    {
 return (string)this.dispatcher.invoke(new gettexthandle(this.gettext), control);
    }
    else
    {
 if (control.gettype() == typeof(textbox))
 {
     return ((textbox)control).text;
 }
 else
 {
     return string.empty;
 }
    }
}

总结:

由上述几个实例可以看到跨线程调用需要使用invoke和begininvoke(暂时没有用到),在一些要求并不是很严格的系统中,暂且认为二者是可以通用的。感兴趣的朋友可以测试运行一下。通过实践会收获的更多!

希望本文所述对大家的c#程序设计有所帮助。

上一篇:

下一篇: