随笔-65  评论-186  文章-8  trackbacks-6

对于在一个线程中调用一个新窗口的理解

前几天在做IM程序的时候,遇到这样一个问题:

当用户登录系统后,将进入到主界面。在主界面显示的同时,TCP Listener的线程则开始启动(在构造函数中start),这样,主界面则成了一个server,一直在监听网络的socket。当有socket连接时(即有人给我发信息时),我的聊天窗口将会自动开启。而这时的开启窗口,将不能简单的使用 form.Show() 了,如果仅简单的调用form.Show(), 聊天窗口只会闪烁一下。(打开后马上关闭)。当初我是百思不得其解。后来想可能因为在聊天窗口中,同时有着另二个线程(一个server,一个client),可能因此而与当前的server线程有冲突。于是我直接在主界面的server线程下加入,如果有socket连结,则开启一个新线程,在新线程中打开聊天窗口。哈哈,这样可好,聊天窗口打开了,一切看起来很顺利,就在我沾沾自喜的时候,突然发现,在.NETDebugger中,竟然显示了N个线程数,仔细一查,原来我上面说的方法将会产生N个线程,并且这些线程不会自动停止。完了,这个是个大Bug呀。于是,不得已,只能请求我的老拍档,Google了。

 

在经过和google的一翻“讨论”后,得出如下结论:

当程序运行时,我们已经开启了一个线程,UI 线程. 而平时的一般工作,比如说新开窗口啦,按钮事件啦,这都是在UI 线程的管辖之下。而如果我们新建一个线程,当这个线程需要调用一个新窗口的时候,不可以直接在这个新线程之下调用,而是需要让UI 线程去调用新窗口。而新的线程所做的是给UI线程发送一条信息,让它打开窗口。而做这一步,我们就需要用到Delegate 技术。

根据以上结论,我修改了我的程序,使用Delegate来代替我的线程调用线程的笨方法。结果令我非常满意,程序可以打开聊天窗口,关闭窗口后,线程也会自动中断。不会产生线程垃圾。当初我也想过delegate,可是由于对delegate不熟,就一直懒的去学。可是现在才发现,这些新技术(对我而言),实在是太有效了。看了,我还是需要再加把劲,多学点类似的新知识。

 

有相同问题的朋友,如果你还没解决,不妨给俺发个email,大家好互相交流交流。过二天我会把在IM系统中使用Delegate的心得也放上来。希望大家到时多给意见。

posted on 2004-11-28 01:29 Ray Chang 阅读(1831) 评论(6) 编辑 收藏