gpt4 book ai didi

wcf - 关闭具有线程的 Windows 服务

转载 作者:行者123 更新时间:2023-12-04 12:01:17 29 4
gpt4 key购买 nike

我有一个用 .NET 3.5 (c#) 编写的 Windows 服务,它带有一个 System.Threading.Timer,它在每个回调中生成多个线程。这些只是普通线程(没有线程池),我设置了 IsBackground = true在每个线程上,因为我只会运行托管代码。

当用户停止服务时,所有线程会发生什么变化?他们优雅地死去吗?我没有任何通过调用 join 或 abort 来管理线程的代码。假设 IsBackground = true 是否正确?足以假设当用户停止服务时线程将被处理和停止吗?当有人通过服务管理器 GUI 停止 Windows 服务时究竟会发生什么?它会在触发 OnStop 事件后终止进程吗?

这对我来说实际上是可以接受的,因为我已经构建了一个单独的机制,允许用户在停止服务之前确定没有线程。这是通过从在 Windows 服务内运行的 ServiceHost 公开的 2 个 WCF 方法完成的。有一种方法可以停止生成新线程,另一种方法是查询剩余的运行线程数。

我只是好奇如果他们跳过这些步骤并停止服务会发生什么......似乎 IsBackground 有助于实现这一点:

最佳答案

从您提供的 MSDN 链接:

A thread is either a background thread or a foreground thread. Background threads are identical to foreground threads, except that background threads do not prevent a process from terminating. Once all foreground threads belonging to a process have terminated, the common language runtime ends the process. Any remaining background threads are stopped and do not complete.



设置线程的 IsBackground属性(property)到 true一旦 OnStop() 将允许您的 Windows 服务立即终止回调已完成执行并且所有前台线程(如果有)都已退出。后台线程将在它们碰巧处于执行状态时停止,因此如果这些线程需要正常终止,您将需要使用不同的机制。

一种方法是使用检查 ManualResetEvent 的前台线程。通知线程关闭的对象。在您的 OnStop()回调,设置 ManualResetEvent然后使用 Join() 等待线程退出.如果他们没有在合理的时间内退出,您可以强行终止他们,因为进程正在退出。

关于wcf - 关闭具有线程的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794917/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com