救救我啊,线程释放问题! 你终止线程的方法有问题。abort并不能确保终止线程。一般应该从线程函数中主动退出,这样比较安全。线程函数一般为无限循环,可以设置一个标志,当标志为真时跳出循环。这方面我所知有限,仅供参考。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我试过了,如果是一个button_Click事件里面写同样的语句,在关闭程序后不会有这种情况,但就是Form1_Closed里面写就会,为什么啊 如果不行,试试Thread1.Dispose ( ) ;直接通知内存回收工具回收该线程。再利用Application.Exit();退出应用,很直接,但有时会出现随机异常,原因还没去查。 Thread类的Abort方法被调用时,线程不会立即停止执行,所以会出现你所说的现象。但当你在button_Click事件里面写同样的语句,在关闭程序后不会有这种情况,是因为线程仍然在执行,不过你不知道罢了。 绝对不能不管。你必须在线程中主动退出。退出方法很多,在没有消息循环的线程中,唯一方法是用标志,如:class abc(){ static bool bIsStopMyThread = false; void StartTrhead() { Thread __thr = new Thread(mythread); __thr.Start(); ... bIsStopMyThread = true; __thr.Abort(); } void mythread() { while(!bIsStopMyThread) { ... } }} 好像是tcpListener的问题如果有tcpListener.AcceptSocket()程序会在那停住 你的问题我遇到过,是因为tcpListener没有关上的原因。你要把tcpListener定义为公共的,然后在外部调用Abort后,执行tcpListener.close()才可以if(onoff==false){ LisFrm.Port=Int32.Parse(textBox1.Text.Trim()); bool crc=LisFrm.crcdate(); newTherad=new Thread(new ThreadStart(LisFrm.StartListen)); LisFrm.ServerFrm =this; newTherad.IsBackground=true; newTherad.Start(); button1.Text ="停止"; onoff=true;}else{ newTherad.Abort(); LisFrm.serverListener.Stop(); newTherad=null; button1.Text ="监听"; onoff=false;} 你也可以在catch(System.Threading.ThreadAbortException)中执行tcpListener.stop()(刚才说错是不是tcpListener.close()而是tcpListener.stop()),但有时会不管用,不如上一个方法可靠。 谢谢 Muf(沐枫) ,fa2002(叮当) :) Invoke执行的方法无法传递参数? 急,,希望帮我一下 如何把excel所有数据导入到一个数组中? ActiveReports3.0 For Net如何使用? 请大家推荐一套界面库 return返回是的是一个对象的副本吗还是返回一个对象的引用副本!!! 在windows服务里面,获取当前程序的路径是,获取的为什么是:winnt\system32 IPv6 問題 无分之问:什么叫做com?做什么用?能不能不用com? c#gdi+绘图时出现内存不足的错误,有大神指导下啊 巨难的问题,数据的绑定 C#可不可直接设置打印纸张的大小?横坚打等属性?
再利用Application.Exit();退出应用,很直接,但有时会出现随机异常,原因还没去查。
你必须在线程中主动退出。
退出方法很多,在没有消息循环的线程中,唯一方法是用标志,如:class abc()
{
static bool bIsStopMyThread = false;
void StartTrhead()
{
Thread __thr = new Thread(mythread);
__thr.Start(); ...
bIsStopMyThread = true;
__thr.Abort();
}
void mythread()
{
while(!bIsStopMyThread)
{
...
}
}
}
如果有tcpListener.AcceptSocket()程序会在那停住
你要把tcpListener定义为公共的,然后在外部调用Abort后,执行
tcpListener.close()才可以
if(onoff==false)
{
LisFrm.Port=Int32.Parse(textBox1.Text.Trim());
bool crc=LisFrm.crcdate();
newTherad=new Thread(new ThreadStart(LisFrm.StartListen));
LisFrm.ServerFrm =this;
newTherad.IsBackground=true;
newTherad.Start();
button1.Text ="停止";
onoff=true;
}
else
{
newTherad.Abort();
LisFrm.serverListener.Stop();
newTherad=null;
button1.Text ="监听";
onoff=false;
}
tcpListener.stop()(刚才说错是不是tcpListener.close()而是
tcpListener.stop()),但有时会不管用,不如上一个方法可靠。