windows 使用关闭事件的服务无法停止服务
windows service using shutdown event cant stop the service
我编写了一个 windows 服务,试图从 MSMQ 读取消息并处理它们。我在我的项目中添加了一个安装程序,并将启动设置为手动。我安装该服务,然后通过服务工具启动它。然后我可以返回到我的项目并附加到流程以逐步执行代码。
但是,无论我做什么,我都无法通过代码或服务工具停止服务。我只能认为这是因为我正在使用 ManualResetEvent Class 来控制服务。这是我的代码。我正在尝试测试错误部分,因为此时它应该抛出错误并停止服务。
在我的服务中class我有:
private readonly ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private Thread _thread;
public TestService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_thread = new Thread(WorkerThread)
{
Name = "Test Messaging Reader Service Thread",
IsBackground = true
};
_thread.Start();
}
protected override void OnStop()
{
_shutdownEvent.Set();
if (!_thread.Join(3000))
{ // give the thread 3 seconds to stop
_thread.Abort();
}
IError logger = new Logger();
Exception ex = new Exception("The Test Messaging Service has been stopped.");
logger.Log(this, SeverityEnum.Warning, ex);
}
private void WorkerThread()
{
try
{
while (!_shutdownEvent.WaitOne(0))
{
TestMessageQueueReader processQueue = new TestMessageQueueReader();
processQueue.ReadFromQueue();
_shutdownEvent.Set();
_shutdownEvent.Reset();
}
}
catch (Exception)
{
_shutdownEvent.Set();
_shutdownEvent.Close();
}
}
当我单步执行代码时,它确实会按预期进入异常,此时我希望能够停止服务。
工作线程正在测试之前立即重置事件:
while (!_shutdownEvent.WaitOne(0))
{
// ...
_shutdownEvent.Reset();
}
这意味着除非停止请求恰好在正确的时间到达,否则它将被忽略。
相反,循环应该如下所示:
while (!_shutdownEvent.WaitOne(0))
{
TestMessageQueueReader processQueue = new TestMessageQueueReader();
processQueue.ReadFromQueue();
}
您也不应从工作线程关闭事件,因为其他线程可能仍需要它。 (进程退出时事件会自动关闭,不用担心。)
至于异常处理,不能简单的通过设置事件来让服务停止。如果有多个工作线程,设置事件将停止它们,但不会停止服务本身。我不完全确定如何让 .NET 服务自行停止,但请尝试调用 ServiceBase.Stop.
我编写了一个 windows 服务,试图从 MSMQ 读取消息并处理它们。我在我的项目中添加了一个安装程序,并将启动设置为手动。我安装该服务,然后通过服务工具启动它。然后我可以返回到我的项目并附加到流程以逐步执行代码。
但是,无论我做什么,我都无法通过代码或服务工具停止服务。我只能认为这是因为我正在使用 ManualResetEvent Class 来控制服务。这是我的代码。我正在尝试测试错误部分,因为此时它应该抛出错误并停止服务。
在我的服务中class我有:
private readonly ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private Thread _thread;
public TestService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_thread = new Thread(WorkerThread)
{
Name = "Test Messaging Reader Service Thread",
IsBackground = true
};
_thread.Start();
}
protected override void OnStop()
{
_shutdownEvent.Set();
if (!_thread.Join(3000))
{ // give the thread 3 seconds to stop
_thread.Abort();
}
IError logger = new Logger();
Exception ex = new Exception("The Test Messaging Service has been stopped.");
logger.Log(this, SeverityEnum.Warning, ex);
}
private void WorkerThread()
{
try
{
while (!_shutdownEvent.WaitOne(0))
{
TestMessageQueueReader processQueue = new TestMessageQueueReader();
processQueue.ReadFromQueue();
_shutdownEvent.Set();
_shutdownEvent.Reset();
}
}
catch (Exception)
{
_shutdownEvent.Set();
_shutdownEvent.Close();
}
}
当我单步执行代码时,它确实会按预期进入异常,此时我希望能够停止服务。
工作线程正在测试之前立即重置事件:
while (!_shutdownEvent.WaitOne(0))
{
// ...
_shutdownEvent.Reset();
}
这意味着除非停止请求恰好在正确的时间到达,否则它将被忽略。
相反,循环应该如下所示:
while (!_shutdownEvent.WaitOne(0))
{
TestMessageQueueReader processQueue = new TestMessageQueueReader();
processQueue.ReadFromQueue();
}
您也不应从工作线程关闭事件,因为其他线程可能仍需要它。 (进程退出时事件会自动关闭,不用担心。)
至于异常处理,不能简单的通过设置事件来让服务停止。如果有多个工作线程,设置事件将停止它们,但不会停止服务本身。我不完全确定如何让 .NET 服务自行停止,但请尝试调用 ServiceBase.Stop.