关于线程结束的一个问题
在软件里需要重新关闭所有硬件,再打开所有硬件,所以在关闭硬件连接时需要先将和硬件相关的线程彻底结束掉,现在结束所有线程再打开一次线程都可以再运行,就是通过任务管理器里查看,每关闭一次硬件打开一次硬件,线程数增加,内存数也增加,这个比较可怕。结束线程的方式
比如:
if (threadReadMaxonStatus != null && threadReadMaxonStatus.IsAlive)
{
readMaxonStatusFlag = false;
threadReadMaxonStatus.Join();
}
后来在线程后加了彻底回收:
void GCCompleteCollect(Object whichObject)
{
int layer = GC.GetGeneration(whichObject);
GC.Collect(layer);
GC.WaitForFullGCComplete();
}
也是一样的情况。
------解决方案--------------------结束线程thread.Abort(),暴力方式,不建议使用
最好看看有没有释放资源的方法,或者清除线程内的状态,让其从头开始运行,甚至都不需要二次连接
------解决方案--------------------
+1
线程的结束:java中会明确建议不适用stop之类的来停止线程,而推荐在代码中控制让线程执行完毕而结束,c#我想应该也可以套用
1楼大神所说从头运行,不用二次连接:我觉得这么做可以避免一些上次运行的遗留问题
------解决方案--------------------GC.WaitForFullGCComplete();这个最好不要用,因为等待垃圾回收页影响程序性能通常是不值得的
------解决方案--------------------你这里线程开了太多了,很多地方加了Join等待线程结束,这里就自相矛盾了,使用Join的话,就失去了使用线程的意义了,比如你的这句:CreateManageThreadCloseDevice(); //不放在线程里关掉硬件,主界面就会卡
后面立刻看到一段Join语句,运行到Join部分,界面立刻就会被卡住,和直接当前线程里运行没有任何分别(其实有分别,复杂了,维护线程开销大了)。
你这里倒底是哪个新开的线程没结束?我无法判断,因为你线程里面套了其它线程,代码也不够完整,还多出Join,你还是把整个代码放到一个线程里去执行吧,如果只是为了不卡界面,就把所有代码整合到一个后台线程里面,不要嵌套了线程却有等待。
你要学会多用Callback,让要等待的任务放入线程之后后的回调中处理,改变多线程处理模型,如果你学习下sliverlight编程,你会发现在sliverlight大量出现异步封装模式BeginXXX和EndXXX,手动开线程控制根本不去使用。