相关疑难解决方法(0)

如何正确停止多线程.NET Windows服务?

我有一个用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秒,它可以变化).

.net windows-services process terminate

24
推荐指数
2
解决办法
3万
查看次数

标签 统计

.net ×1

process ×1

terminate ×1

windows-services ×1