我有一個服務創建一個線程,該線程應該運行直到互斥體由另一個進程發送信號。我在我的服務代碼以下打開一個與服務共享的互斥體
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()方法是否拋出一個異常,並因此阻止互斥體被正確釋放。 – RogerN 2013-04-29 14:54:59
在那一刻該方法除了返回0之外什麼也不做。它只是一個佔位符,代碼可能會在我有互斥鎖工作後進行。對不起,我很抱歉 – John 2013-04-29 15:01:34