当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 多线程应用程序中调用窗体的一点心得

ASP.NET
ASP.NET在上传文件时对文件类型的高级判断的代码
JQuery运用ajax注册用户实例(后台asp.net)
Asp.net与SQLserver一起打包部署安装图文教程
asp.net 上传下载输出二进制流实现代码
asp.net(C#)解析Json的类代码
asp.net 截取字符串代码
asp.net ubb使用代码
asp.net XML文件操作实现代码
asp.net利用HttpModule实现防sql注入
ASP.NET(C#)中操作SQLite数据库实例
asp.net(c#)ref,out ,params的区别
asp.net(C#)防sql注入组件的实现代码
asp.net FCKeditor自定义非空验证
Asp.net TreeView来构建用户选择输入的方法 推荐
asp.net(C#)函数对象参数传递的问题
Asp.net中的GridView导出遇到的两个问题和解决方法
asp.Net 中获取一周第一天,一月第一天等实现代码
asp.net MaxLengthValidator 最大长度验证控件代码
C# 通用文件上传类
asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图

ASP.NET 中的 多线程应用程序中调用窗体的一点心得


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 35 ::
收藏到网摘: n/a


昨天自己编写一个多线程的程序,主要作用是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 }