c#,service关闭后,Thread继续运行的问题

accomp 2013-11-13 05:22:11
如题,用C#写了个service,OnStart方法里面创建了个Thread,Thread的方法就是
while(true)
{
1,写日志
2,Thread.Sleep(1000)
}

OnStop方法里啥也不干,就是记录下时间。

然后,手动停止service,发现这个Thread并不是随着service停止而停止,而是仍然执行了大约30秒,然后就没了,这是为什么?
为什么service停止而程序不停?
后来什么机制把这个Thread给回收了?

如能解惑,再加100分奉上。
...全文
496 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
accomp 2013-12-04
  • 打赏
  • 举报
回复
结贴晚了,100分补上。
小猪八Q 2013-11-14
  • 打赏
  • 举报
回复
引用 13 楼 wddw1986 的回复:
[quote=引用 12 楼 accomp 的回复:] 另外经测试,基本每次都是30秒左右被回收,这个30秒,是不是指内存保留所有数据的状态都是约30秒? 这个时间,在机器里,比如注册表里,能找到不?
这个30秒是windows服务的机制 windows服务的OnStart和OnStop都有时间限制的。 比如OnStart的时间限制就是30秒,如果你的OnStart服务超过30秒没返回就会报错,因为服务控制管理器就认为服务启动失败了。 而OnStop方法是让你的服务有机会和谐友好的退出,如果你的OnStop没有把该退的东西退干净,那么30秒之后服务进程就会被服务控制管理器强制杀掉。 [/quote]
cheng2005 2013-11-14
  • 打赏
  • 举报
回复
引用 12 楼 accomp 的回复:
另外经测试,基本每次都是30秒左右被回收,这个30秒,是不是指内存保留所有数据的状态都是约30秒? 这个时间,在机器里,比如注册表里,能找到不?
这个30秒是windows服务的机制 windows服务的OnStart和OnStop都有时间限制的。 比如OnStart的时间限制就是30秒,如果你的OnStart服务超过30秒没返回就会报错,因为服务控制管理器就认为服务启动失败了。 而OnStop方法是让你的服务有机会和谐友好的退出,如果你的OnStop没有把该退的东西退干净,那么30秒之后服务进程就会被服务控制管理器强制杀掉。
accomp 2013-11-14
  • 打赏
  • 举报
回复
另外经测试,基本每次都是30秒左右被回收,这个30秒,是不是指内存保留所有数据的状态都是约30秒? 这个时间,在机器里,比如注册表里,能找到不?
cheng2005 2013-11-14
  • 打赏
  • 举报
回复
引用 5 楼 hdhai9451 的回复:
[quote=引用 2 楼 caozhy 的回复:] 道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环) Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。
等待30秒还不行,它就“失去耐心”强行关闭了------>这种判断感觉没有说服力. 我认为二楼的说法更有说服力. 你那个方法是放在表态类里面,没错吧.当你程序退出时,不知道你是什么退出的?如果不是结束程序而退出,那么宿留内存静态方法继续运行,直到缓存被回收才结束程序,你可以尝试每次退出后有多长时间它才会自动结束?[/quote] 如果你不了解C#以及windows服务的机制,那你可以不说话,毕竟你那几个勋章很容易让新人觉得你说的是圣经。
accomp 2013-11-14
  • 打赏
  • 举报
回复
引用 5 楼 hdhai9451 的回复:
[quote=引用 2 楼 caozhy 的回复:] 道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环) Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。
等待30秒还不行,它就“失去耐心”强行关闭了------>这种判断感觉没有说服力. 我认为二楼的说法更有说服力. 你那个方法是放在表态类里面,没错吧.当你程序退出时,不知道你是什么退出的?如果不是结束程序而退出,那么宿留内存静态方法继续运行,直到缓存被回收才结束程序,你可以尝试每次退出后有多长时间它才会自动结束?[/quote] 大约30秒
accomp 2013-11-14
  • 打赏
  • 举报
回复
感谢各位回复。 我知道应该怎么关线程,发帖子的目的,就是想知道,到底哪个机制,或者说哪个监测程序负责回收? 有什么方法可以让他不回收不?也就是service停止后,如果线程执行的动作没完,让它执行完。
Anlige 2013-11-14
  • 打赏
  • 举报
回复
我常用的方法就是加个变量控制,主动退出线程
CTYips 2013-11-14
  • 打赏
  • 举报
回复
可以在关闭server的方法里面加个判断干掉线程 if (_thread != null) { if (_thread.IsAlive) { _thread.Abort(); } }
CZLJ2008 2013-11-14
  • 打赏
  • 举报
回复
赞同caozhy版主的说法
Andy__Huang 2013-11-13
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环) Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。
等待30秒还不行,它就“失去耐心”强行关闭了------>这种判断感觉没有说服力. 我认为二楼的说法更有说服力. 你那个方法是放在表态类里面,没错吧.当你程序退出时,不知道你是什么退出的?如果不是结束程序而退出,那么宿留内存静态方法继续运行,直到缓存被回收才结束程序,你可以尝试每次退出后有多长时间它才会自动结束?
Greatcqi 2013-11-13
  • 打赏
  • 举报
回复
试试把线程的IsBackGround属性设为true呢,被指定为后台的线程是会随主线程的关闭而结束的。
c02645 2013-11-13
  • 打赏
  • 举报
回复
线程应该是在内存里面吧,你操作的只是停掉它,但它有一部分已在内存里面了。 就像你播放电影一样,你要关掉播放器了,可是它还要停一下才关掉的,它有部分还在缓存或内存里面,还没有完全释放。
threenewbee 2013-11-13
  • 打赏
  • 举报
回复
道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环) Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。

110,567

社区成员

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

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

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