我有一个用C#编写的Windows服务,它创建了一个卡车负载的线程并建立了许多网络连接(WMI,SNMP,简单的TCP,http).尝试使用服务MSC管理单元停止Windows服务时,停止服务的调用返回相对较快,但该过程继续运行约30秒左右.
主要问题是它可能需要30秒以上才能停止.我能找到什么,我该如何寻找它?
第二个问题是为什么服务msc管理单元(服务控制器)返回,即使进程仍在运行.有没有办法让它只在进程实际被杀死时返回?
这是服务的OnStop方法中的代码
protected override void OnStop()
{
//doing some tracing
//......
//doing some minor single threaded cleanup here
//......
base.OnStop();
//doing some tracing here
}
Run Code Online (Sandbox Code Playgroud)
编辑以响应Thread清理答案
你们中的许多人已经回答我应该跟踪我的所有线程然后清理它们.我不认为这是一种实用的方法.首先,我无法访问一个位置的所有托管线程.该软件非常庞大,包含不同的组件,项目甚至第三方dll都可以创建线程.我无法在一个位置跟踪所有这些,或者有一个所有线程检查的标志(即使我可以让所有线程检查一个标志,许多线程阻塞信号量之类的东西.当它们阻塞时它们可以检查.我将不得不让他们等待超时,然后再检查这个全局标志和等待.
IsBackround标志是一个有趣的事情要检查.但是,我怎么能知道我是否有运行arround的forground线程?我将不得不检查创建线程的代码的每个部分.有没有其他方法,也许是一个可以帮助我找到这个的工具.
但最终,这个过程确实停止了.我似乎只需要等待一些东西.但是,如果我在OnStop方法中等待X ammount时间,那么它将花费大约30秒+ X来停止.无论我尝试做什么,在OnStop返回实际停止的过程之后,过程似乎需要大约30秒(它不总是30秒,它可以变化).