C#跨线程操作控件

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在看别人代码的时候总是会Invoke和BeginInvoke方法,虽然大致明白是什么意思,但却不能很好的使用,上网查了很多资料,刚巧看到自己求学期间转载过一篇博文:

c#Invoke和BeginInvoke的区别

博文中讲的都是一些理论知识,本文介绍几个常见的问题:

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

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

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

PRivatedelegatevoidsetRichTexBox(strings);publicvoidsetText(stringtxt)

{if(this.t_revmsg.InvokeRequired)//等待异步{

setRichTexBox fc=newsetRichTexBox(Set);this.Invoke(fc,newobject[]{ txt});}else{this.t_revmsg.AppendText(txt);

}

}

privatevoidSet(stringtxt)

{

t_revmsg.AppendText(txt);

}

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

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

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

privatevoidbutton2_Click(objectsender, RoutedEventArgs e)

{this.textBox1.Dispatcher.Invoke(newWriteDelegate(WriteMethod),"asdf");

}privatedelegatevoidWriteDelegate(stringstr);privatevoidWriteMethod(stringstr)

{this.textBox1.AppendText(str);

}

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

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

privatevoidbutton1_Click(objectsender, RoutedEventArgs e)

{

Thread thread=newThread(newThreadStart(StartServer));

thread.Start();

}publicvoidStartServer()

{intport = Convert.ToInt32(GetText(this.tbPort));

ServerSocket serverSocket=newServerSocket(port);

serverSocket.Start();

}privatedelegatestringGetTextHandle(Control control);privatestringGetText(Control control)

{if(this.Dispatcher.Thread !=System.Threading.Thread.CurrentThread)

{return(string)this.Dispatcher.Invoke(newGetTextHandle(this.GetText), control);

}else{if(control.GetType() ==typeof(TextBox))

{return((TextBox)control).Text;

}else{returnstring.Empty;

}

}

}

总结:

由上述几个实例可以看到跨线程调用需要使用Invoke和BeginInvoke(暂时没有用到),在一些要求并不是很严格的系统中,暂且认为二者是可以通用的。(不知道对不?望高手指点一二)

目前为止,所接触到的常见问题只有这些,以后遇到再补充吧。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航