c# - 优雅地处理 Windows 服务的关闭

原文 标签 c# multithreading windows-services

假设您有一个多线程 Windows 服务,它执行许多不同的操作,这些操作需要相当多的时间,例如从不同的数据存储中提取数据,解析所述数据,将其发布到外部服务器等。 操作可以在不同的层中执行,例如应用层、存储库层或服务层。

在此 Windows 服务生命周期的某个时刻,您可能希望通过 services.msc 将其关闭或重新启动,但是,如果您无法在该服务的时间跨度内停止所有操作并终止 Windows 服务中的所有线程。 msc 希望通过停止程序完成,它会挂起,您必须从任务管理器中将其杀死。

由于上述问题,我的问题如下:您将如何实现处理 Windows 服务关闭的故障安全方式?我有一个作为关闭信号的 volatile bool 值,由我的服务基类中的 OnStop() 启用,并且应该优雅地停止我的主循环,但是如果在其他层有操作,这没有任何值(value)是时候做任何该操作了。

这应该如何处理?我目前不知所措,需要一些创造性的投入。

最佳答案

我会使用 CancellationTokenSource并从 OnStop 传播取消 token 方法到所有层,所有线程和任务都从那里开始。它在框架中,所以如果你关心它,它不会打破你的松散耦合(我的意思是,无论你在哪里使用线程/任务,你都有可用的“CancellationToken”。

这意味着您需要调整异步方法以考虑取消 token 。

您还应该知道 ServiceBase.RequestAdditionalTime .如果无法按时取消所有任务,您可以申请延期。

或者,也许您可​​以探索 IsBackground 选择。当进程即将退出时,CLR 会停止 Windows 服务中启用此功能的所有线程:

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.

关于c# - 优雅地处理 Windows 服务的关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25178553/

相关文章:

c# - 缓慢将游戏对象移动到鼠标位置

c# - Quartz.Net cron触发器每月计划一次作业

windows-services - 如何在 Windows 桌面的任务管理器中隐藏 Windows 服务

winapi - 我可以使用 svchost.exe 来托管我自己的服务吗?

c# - 为什么不使用KeyDown CTRL + KEY?

c# - 在C#中设计可配置的返回值

c# - 在 Linux X11/Gtk 上创建分层窗口

multithreading - 自同步 Goroutine 以死锁告终

Mysql 选择更新 - 它没有锁定目标行。我如何确保它确实如此?

java - Java线程设置为null时会发生什么?