打开与服务共享的互斥锁
本文关键字:共享 服务 | 更新日期: 2023-09-27 18:11:15
我有一个服务,它创建了一个线程,该线程应该运行,直到另一个进程发出互斥锁的信号。在我的服务代码
中有以下内容 private readonly Mutex _applicationRunning = new Mutex(false, @"Global'HsteMaintenanceRunning");
protected override void OnStart(string[] args)
{
new Thread(x => StartRunningThread()).Start();
}
internal void StartRunningThread()
{
while (_applicationRunning.WaitOne(1000))
{
FileTidyUp.DeleteExpiredFile();
_applicationRunning.ReleaseMutex();
Thread.Sleep(1000);
}
}
现在我有一个控制台应用程序,它应该声明互斥锁并强制while循环退出
var applicationRunning = Mutex.OpenExisting(@"Global'HsteMaintenanceRunning");
if (applicationRunning.WaitOne(15000))
{
Console.Write("Stopping");
applicationRunning.ReleaseMutex();
Thread.Sleep(10000);
}
当控制台应用程序试图打开互斥锁时,我得到错误"由于放弃互斥锁而等待完成"。怎么了?
我建议你使用Service内置的停止信号而不是互斥锁。互斥锁类更适合于管理对共享资源的独占访问,这里不是这样。您也可以使用系统事件,但是由于服务已经有了在停止时发出信号的内置机制,为什么不使用它呢?
你的服务代码应该是这样的:
bool _stopping = false;
Thread _backgroundThread;
protected override void OnStart(string[] args)
{
_backgroundThread = new Thread(x => StartRunningThread());
_backgroundThread.Start();
}
protected override void OnStop()
{
_stopping = true;
_backgroundThread.Join(); // wait for background thread to exit
}
internal void StartRunningThread()
{
while (!stopping)
{
FileTidyUp.DeleteExpiredFile();
Thread.Sleep(1000);
}
}
然后,你的控制台应用程序需要使用框架的ServiceController类来发送关闭消息给你的服务:
using System.ServiceProcess;
...
using (var controller = new ServiceController("myservicename")) {
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(15.0));
}