社区
C#
帖子详情
C#中线程的销毁
csdn小虫
2010-03-22 05:23:27
Thread myThread; //声明一个线程
...
现在程序要退出,我要销毁线程后,然后再退出程序。
如果线程正在执行,我执行myThread.Abort(); 程序正常。
如果线程整处于挂起的状态,我执行myThread.Abort()就会出现异常。
所以,我就判断,如果线程是挂起状态,我就唤醒线程,然后再执行Abort()方法。
这样做合理么?
...全文
3724
24
打赏
收藏
C#中线程的销毁
Thread myThread; //声明一个线程 ... 现在程序要退出,我要销毁线程后,然后再退出程序。 如果线程正在执行,我执行myThread.Abort(); 程序正常。 如果线程整处于挂起的状态,我执行myThread.Abort()就会出现异常。 所以,我就判断,如果线程是挂起状态,我就唤醒线程,然后再执行Abort()方法。 这样做合理么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
这样线程就自动退出
码农星球撸码J
2010-03-23
打赏
举报
回复
[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)
C#
Winform
线程
创建子窗体
C#
Winform 利用
线程
延时创建子窗体并且可跨
线程
控制主窗体的控件
WinForm
C#
多
线程
等待窗体
由于用到了非托管资源,最简单的方式是把托管资源(WaitForm)放在工作
线程
,
线程
结束,窗体会自动
销毁
,不用自己写清理代码。 ShowDialog自动阻塞当前
线程
,这使它成为最优的解决方式。
C#
多
线程
和Socket网络编程精讲
【教学理念】 1、把“需要工作的人”变成“工作需要的人” 2、创设“立足学生、突出项目、强化技术、提高能力”的教学局面。 【课程特色】 1、课程设计循序渐进、讲解细致、通俗易懂、非常...
csharp多
线程
示例(全)
csharp多
线程
示例(全),根据网上教材重写的示例代码,纠正了教材上面的一些小Bug
C#
线程
同步详解
而创建、
销毁
和调度
线程
所需要相当昂贵的内存资源,另外,很多的开发人员看见自己程序的
线程
没有做任何有用的事情时习惯创建更多的
线程
,为了构建可伸缩、响应灵敏的程序,我们在前面介绍了
C#
异步编程详解 ...
C#
110,539
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章