多线程应用程序中调用窗体的一点心得
2005-07-27 15:26
507 查看
昨天自己编写一个多线程的程序,主要作用是TCP通迅的小程序,里面使用了多线程的技术,遇到一个有趣的问题:就是在工作线程中我调用了一个窗体,让它显示出来。如Form1 f=new Form1();f.show();这种代码平时一点问题都没有。但是在工作线程中却无法调过了。我的FORM1在桌面上动弹不得了。什么也不响应。有点象假死机的状态。后来我将Form1 f;这代码放到主线程里去实例化,一切都正常了。(估计是工作线程的原因)经过查阅MSDN才知道:当程序运行时,我们已经开启了一个线程,UI 线程. 而平时的一般工作,比如说新开窗口啦,按钮事件啦,这都是在 UI 线程的管辖之下。而如果我们新建一个线程,当这个线程需要调用一个新窗口的时候,不可以直接在这个新线程之下调用,而是需要让 UI 线程去调用新窗口。而新的线程所做的是给UI线程发送一条信息,让它打开窗口。而做这一步,我们就需要用到 Delegate 技术。 如果一个控件的处理程序和操作它的代码不在同一线程中,则需要使用 控件名.Invoke 方法代码片断如下://工作线程的代码将直接调用FOrm下定义的FormShow方法ListenerThread(){//这是一个自由线程。不能在这里直接调用一个窗体FormShow();//OK}delegate void FormHandler(DataSet ds);//声明一个委托//定义一个方法此方法用来显示一个窗体private void FormShow(DataSet ds)
{
if (!this.InvokeRequired) //如果当前线程不是主UI线程,返回true,否则,返回false.
{
frmBills fb = new frmBills();
fb.Show();
fb.Display(ds);
}
else
{
FormHandler fHandler = new FormHandler(this.FormShow); //创建一个新instance指向FormShow.
this.Invoke(fHandler, new object[] {ds}); //启动delegate
}
作者Blog:http://blog.csdn.net/greystar/
{
if (!this.InvokeRequired) //如果当前线程不是主UI线程,返回true,否则,返回false.
{
frmBills fb = new frmBills();
fb.Show();
fb.Display(ds);
}
else
{
FormHandler fHandler = new FormHandler(this.FormShow); //创建一个新instance指向FormShow.
this.Invoke(fHandler, new object[] {ds}); //启动delegate
}
作者Blog:http://blog.csdn.net/greystar/
相关文章推荐
- 多线程应用程序中调用窗体的一点心得
- 多线程应用程序中调用窗体的一点心得
- 多线程应用程序中调用窗体的一点心得(摘)
- 多线程应用程序中调用窗体的一点心得
- 多线程应用程序中调用窗体的一点心得
- 多线程应用程序中调用窗体的心得(zz至UP TO YOU的blog)
- 多线程应用程式中调用窗体的一点心得-.NET教程,算法/线程
- 使用多线程提高 Windows 窗体应用程序的性能时,必须注意以线程安全方式调用控件
- 如何在多线程中调用winform窗体控件
- XmlHttpRequest调用Webservice的一点心得
- 19、构建多线程应用程序:委托异步调用方法(BeginInvoke,EndInvoke,AsyncCallback)
- winform 利用 多线程 处理窗体假死,利用 Invoke BeginInvoke 处理子线程调用 UI 控件报错的问题
- 如何在多线程中调用winform窗体控件
- [Unity]多线程编程的一点心得
- 如何在多线程中调用winform窗体控件
- 关于windows metro应用程序开发的一点小心得
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- C#中WPF使用多线程调用窗体组件的方法
- C#窗体应用程序中,实现调用已有应用程序
- 如何在多线程中调用winform窗体控件