日期:2014-05-17  浏览次数:21136 次

c#,service关闭后,Thread继续运行的问题
如题,用C#写了个service,OnStart方法里面创建了个Thread,Thread的方法就是
while(true)
{
    1,写日志
     2,Thread.Sleep(1000)
}

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

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

如能解惑,再加100分奉上。

------解决方案--------------------
道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环)
Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。
------解决方案--------------------
线程应该是在内存里面吧,你操作的只是停掉它,但它有一部分已在内存里面了。
就像你播放电影一样,你要关掉播放器了,可是它还要停一下才关掉的,它有部分还在缓存或内存里面,还没有完全释放。
------解决方案--------------------
试试把线程的IsBackGround属性设为true呢,被指定为后台的线程是会随主线程的关闭而结束的。
------解决方案--------------------
引用:
道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环)
Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。


等待30秒还不行,它就“失去耐心”强行关闭了------>这种判断感觉没有说服力.

我认为二楼的说法更有说服力.
你那个方法是放在表态类里面,没错吧.当你程序退出时,不知道你是什么退出的?如果不是结束程序而退出,那么宿留内存静态方法继续运行,直到缓存被回收才结束程序,你可以尝试每次退出后有多长时间它才会自动结束?
------解决方案--------------------
赞同caozhy版主的说法
------解决方案--------------------
可以在关闭server的方法里面加个判断干掉线程
if (_thread != null)
{
  if (_thread.IsAlive)
  {
    _thread.Abort();
  }
}
------解决方案--------------------
我常用的方法就是加个变量控制,主动退出线程
------解决方案--------------------
引用:
Quote: 引用:

道理很简单,你应该在Stop中通知线程退出。(可以用一个bool变量通知线程,线程收到后退出循环)
Windows监测程序没有终止就会等待,但是等待30秒还不行,它就“失去耐心”强行关闭了。


等待30秒还不行,它就“失去耐心”强行关闭了------>这种判断感觉没有说服力.

我认为二楼的说法更有说服力.
你那个方法是放在表态类里面,没错吧.当你程序退出时,不知道你是什么退出的?如果不是结束程序而退出,那么宿留内存静态方法继续运行,直到缓存被回收才结束程序,你可以尝试每次退出后有多长时间它才会自动结束?


如果你不了解C#以及windows服务的机制,那你可以不说话,毕竟你那几个勋章很容易让新人觉得你说的是圣经。
------解决方案--------------------
引用:
另外经测试,基本每次都是30秒左右被回收,这个30秒,是不是指内存保留所有数据的状态都是约30秒?
这个时间,在机器里,比如注册表里,能找到不?

这个30秒是windows服务的机制
windows服务的OnStart和OnStop都有时间限制的。
比如OnStart的时间限制就是30秒,如果你的OnStart服务超过30秒没返回就会报错,因为服务控制管理器就认为服务启动失败了。
而OnStop方法是让你的服务有机会和谐友好的退出,如果你的OnStop没有把该退的东西退干净,那么30秒之后服务进程就会被服务控制管理器强制杀掉。

------解决方案--------------------
引用:
Quote: 引用:

另外经测试,基本每次都是30秒左右被回收,这个30秒,是不是指内存保留所有数据的状态都是约30秒?
这个时间,在机器里,比如注册表里,能找到不?

这个30秒是windows服务的机制
windows服务的