C#中线程的销毁

csdn小虫 2010-03-22 05:23:27
Thread myThread; //声明一个线程
...


现在程序要退出,我要销毁线程后,然后再退出程序。
如果线程正在执行,我执行myThread.Abort(); 程序正常。

如果线程整处于挂起的状态,我执行myThread.Abort()就会出现异常。
所以,我就判断,如果线程是挂起状态,我就唤醒线程,然后再执行Abort()方法。
这样做合理么?

...全文
3724 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
技术小牛 2011-05-26
  • 打赏
  • 举报
回复
这个要顶,有结果没,楼主。争论了半天
csdn小虫 2010-04-15
  • 打赏
  • 举报
回复
多线程执行,为了同步,多线程执行方法中用了Mutex互斥对象。

现在又如下情况:
比如 目前有 10 条线程,已经处于挂起状态,程序要退出该怎么做??

如果线程正在运行,程序要退出该怎么做?
ljqqqq836 2010-04-15
  • 打赏
  • 举报
回复
关注下。
walkghost 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 carpathia 的回复:]

System.Environment.Exit(0);可以退出程序所有的后台线程,并关闭程序
如果严格的话,最好采用某个标识来让线程退出,比如thread在运行的过程中,需要判断一个bool flag,如果为true,则线程正常运行,当想终止线程时,将flag设置为false,线程在后台检测到后,直接将线程主方法return,则线程结束
[/Quote]
System.Environment.Exit(0);是不安全的退出方法。
csdn小虫 2010-04-15
  • 打赏
  • 举报
回复
还有一个问题

有两个线程,执行的方法分别是:

private void Execute1()
{
aaa;
bbb;
thread2.Join();
ccc;
}


private void Execute2()
{
111;
222;
333;
}

定义两个线程,同时执行后,为什么线程1中,遇到Thread2.Join()后,
他会等待Execute2的方法执行完毕。
但是Execute2执行完毕后,为什么Execute1中,Thread2.Join()后面的代码不会执行,
并且,线程1的状态变成Stopped状态????

不是说,线程1会等待线程2执行完毕后,然后会继续剩下的代码么?????


Joe-xXx 2010-04-15
  • 打赏
  • 举报
回复
try
{
myThread.Abort();
myThread.Join();
}
catch
{
}

妥协做法
wxhysoftsodc 2010-04-15
  • 打赏
  • 举报
回复
是个问题,等答案。
tfzdh 2010-04-15
  • 打赏
  • 举报
回复
关注下。
jackson35296 2010-03-24
  • 打赏
  • 举报
回复
把线程的属性设置为Background,这样程序退出的时候会自动结束线程,否则会卡住
yangfan1981 2010-03-24
  • 打赏
  • 举报
回复
极度不赞同强行结束线程。容易出现难以预料的bug。

建议楼主重新设计程序。

让线程在某种情况下,或者收到某个消息时,自己退出。
yingzhilian2008 2010-03-24
  • 打赏
  • 举报
回复
貌似有个属性 isactive判断一下吧!!
onlyprice 2010-03-23
  • 打赏
  • 举报
回复
最好的处理方式:设置一个全局标识位isrunning= true;

线程处理函数,while( isruning){
}

要结束该线程时,将isruning= false;
这样线程就自动退出
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzx509 的回复:]
线程原有的一些挂起、恢复方法都过时了。
AutoResetEvent,你查看下这个类。
[/Quote]
同意
lethwei 2010-03-23
  • 打赏
  • 举报
回复
下面的文章对 .net 中的线程状态, 及中断方法做了比较系统的介绍, 有兴趣可以读一读
http://www.albahari.com/threading/part2.aspx#_Unblocking
lethwei 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yuimison 的回复:]

上面有大侠提议 说 在 线程的执行方法中 判断一个flag标志,在决定线程是否要销毁,直接在线程方法内部执行Abort方法。
但是如果 线程挂起的时候,线程的方法不是判断不了flag标志了么????
[/Quote]
没错, 检查 flag 方法太过简单, 在线程处于挂起时无法起到作用, 配合 Thread.Interrupt() 的调用可以解决大部分时候的挂起问题, 这个时候线程方法会触发 ThreadInterruptedException 异常, 从而退出挂起状态, 然后就可以做线程的销毁处理了
honkerhero 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yuimison 的回复:]

上面有大侠提议 说 在 线程的执行方法中 判断一个flag标志,在决定线程是否要销毁,直接在线程方法内部执行Abort方法。
但是如果 线程挂起的时候,线程的方法不是判断不了flag标志了么????
[/Quote]

那位说的是Thread定时Sleep吧,如果suppend确实不能这样用。

把正在执行的Abort掉,挂起的就直接调用System.Environment.Exit(0);吧,反正它也是闲着呢,一般不会有什么后遗症
zzx509 2010-03-23
  • 打赏
  • 举报
回复
线程原有的一些挂起、恢复方法都过时了。
AutoResetEvent,你查看下这个类。
csdn小虫 2010-03-23
  • 打赏
  • 举报
回复
上面有大侠提议 说 在 线程的执行方法中 判断一个flag标志,在决定线程是否要销毁,直接在线程方法内部执行Abort方法。
但是如果 线程挂起的时候,线程的方法不是判断不了flag标志了么????
csdn小虫 2010-03-23
  • 打赏
  • 举报
回复
如果线程执行的方法中正在执行Thread.Sleep(5000);
这时候,执行了挂起线程,那么线程能挂起么?

如果正在执行Thread.Sleep(5000); 这时候 销毁线程,又会如何?
csdn小虫 2010-03-23
  • 打赏
  • 举报
回复
System.Environment.Exit(0)

在窗体的Closed事件中写么?
加载更多回复(4)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧