【问题标题】:is this a reasonable strategy for a thread in a Windows service这是 Windows 服务中线程的合理策略吗
【发布时间】:2011-02-15 02:46:29
【问题描述】:

在我的 OnStart 中,我将 HKLM 注册表值设置为“是”。

然后我实例化一个 c# 类,该类将其方法之一作为线程启动。

该方法处理来自远程服务的记录,然后休眠。

当它唤醒时,如果注册表项仍然是“是”,它会处理来自远程源的更多记录。

OnStop 将 HKLM 键设置为“否”并返回。

我不确定窗帘后面会发生什么……似乎至少有两种可能性。

(A) OnStop 退出后服务停止,但线程一直运行,直到唤醒并退出。

(B) 服务等待线程结束,然后也退出。

我猜是(A),但我真的不知道。

无论如何,这是一个合理的策略吗? thnx / g.

【问题讨论】:

  • 真的需要这样使用注册表吗?

标签: multithreading windows-7 .net-4.0 c#-4.0 windows-server-2008


【解决方案1】:

我更喜欢使用Timer。在您的服务类中创建一个静态计时器变量,每次计时器经过时都会启动您的处理事件。在您的OnStop 中,只需关闭计时器即可。

【讨论】:

  • 我在工作线程中使用计时器(原文如此);通常,服务(原文如此)将 24/7 运行;这个想法是许多服务将出于多种目的而运行;场景是由于各种原因可能需要重新启动服务器:诸如发送带有特殊主题的电子邮件之类的活动可能会触发更新注册表的任务,从而导致许多服务以受控方式关闭;同样,如果管理员在场,只需双击即可触发 .reg 文件——这比单独停止许多服务更快、更方便。
【解决方案2】:

我不会将注册表用于这样的事情。你想通知工作线程是时候退出了,让它自己退出,但你可以做得比使用注册表更好。

使用布尔“keepRunning”变量而不是使用注册表。有一个“workInterval”设置/变量来指示应该多久完成一次工作,但是将你的睡眠间隔设置得足够短,比如每隔几秒钟,以便经常唤醒并检查“keepRunning”变量,以便服务可以响应停止命令。如果“keepRunning”测试为假,只需退出主循环,您的服务进程就会结束。如果“keepRunning”为真,则测试是否该工作,如果该工作,则再次睡眠。如果工作很长,请考虑每隔一段时间从工作循环中检查“keepRunning”变量,以便在服务应该关闭时保存状态并正常退出。

您的 OnStop 处理程序将简单地将“keepRunning”设置为 false,并且不执行任何其他操作。这样就不需要用 Thread.Abort 之类的东西强行杀死 worker,服务进程会在 OnStop 事件发生后的几秒内关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2011-05-21
    • 2011-04-24
    • 2014-07-12
    • 2011-02-28
    相关资源
    最近更新 更多