【发布时间】:2012-02-01 05:26:07
【问题描述】:
我创建了以下测试程序:
static void Main(string[] args)
{
using (var mutex = new Mutex(false, "foobar"))
{
Console.WriteLine("Created mutex");
try
{
try
{
if (!mutex.WaitOne(TimeSpan.FromSeconds(5), false))
{
Console.WriteLine("Unable to acquire mutex");
Environment.Exit(0);
}
}
catch (AbandonedMutexException)
{
Console.WriteLine("Mutex was abandoned");
}
Console.WriteLine("Acquired mutex - sleeping 10 seconds");
Thread.Sleep(10000);
}
finally
{
mutex.ReleaseMutex();
Console.WriteLine("Released mutex");
}
}
我的想法是我运行程序,当线程休眠 10 秒时,我通过任务管理器终止进程。下次我运行该过程时,我希望AbandonedMutexException 会在WaitOne() 调用中被捕获。但我没有看到输出“互斥锁被放弃”。
MSDN documentation 提到以下内容:
当一个线程放弃一个互斥体时,下一次抛出异常 获取互斥锁的线程。
但是,当我的进程被杀死(而不是同一应用程序中的另一个线程)时,操作系统似乎正在释放互斥锁。
有没有办法让我能够检测到以这种方式放弃的互斥锁?
【问题讨论】:
-
您是对的,当您的进程终止时,它的
Mutexes 也会终止。您是否尝试确定您的应用程序何时不正确关闭? -
@M.Babcock - 我想我试图区分获得互斥锁的进程优雅结束或在有机会正确清理之前被杀死的情况。有没有办法做到这一点?
-
我不知道。如果这不能正常工作,那么我只允许应用程序的单个实例的逻辑将无法正常工作,所以我很高兴它可以按预期工作。 :)