【发布时间】:2013-04-29 14:01:31
【问题描述】:
我有一个服务,它创建一个带有循环的线程,该循环应该一直运行到互斥锁由另一个进程发出信号为止。我的服务代码中有以下内容
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);
}
当控制台应用程序尝试打开互斥锁时,我收到错误“由于放弃的互斥锁导致等待已完成”。这里有什么问题?
【问题讨论】:
-
一个废弃的互斥体意味着一个线程在释放它对互斥体的持有之前被终止。这让我想知道您的服务的 DeleteExpiredFile() 方法是否抛出异常,从而阻止互斥锁被正确释放。
-
此时该方法除了返回 0 外什么都不做。它只是一个占位符,一旦我让互斥锁工作,代码就可以去。很抱歉造成混乱
标签: c# multithreading service mutex