Mutex不在Vista中工作

时间:2009-10-01 13:34:44

标签: c# multithreading

我有2个进程在运行。两者都使用代码

创建一个命名的互斥锁
Mutex mut = new Mutex(false, "ABC");

然后,进程使用mut.WaitOne()mut.ReleaseMutex()来访问共享数据库文件,在不同方法中多次访问。

此代码在XP上运行没有任何问题。

在Vista上,我只是尝试运行一个进程(进程1)并使用相同的代码创建互斥锁。 在行mut.WaitOne()上,进程1永久进入休眠状态。 请注意,到目前为止我还没有开始过程2。

在方法(methodX)中调用

mut.WaitOne()。 methodX在另一个方法(methodY)的循环中调用。

methodX的结构是

try
{
    mut.WaitOne();
    //do work on the db file
}
catch
{
}
finally
{
    try
    {
        mut.ReleaseMutex();
    }
    catch
    {
    }
}

methodY和methodX也在BackgroundWorker中工作。虽然在主应用程序中调用了初始化互斥锁的代码。 但是,主应用程序从不拥有互斥锁。


修改

以下是代码:

string mutexName = @"Global\OneComClientDb";
bool mutexWasCreated;
MutexSecurity mSec = new MutexSecurity();
MutexAccessRule rule = new MutexAccessRule(
                         new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                         MutexRights.FullControl,
                         AccessControlType.Allow);
mSec.AddAccessRule(rule);
mut = new Mutex(false, mutexName, out mutexWasCreated, mSec);

2 个答案:

答案 0 :(得分:0)

这两个进程是否在不同的会话中运行?你试过了吗?

Mutex mut = new Mutex(false, @"Global\ABC" );

答案 1 :(得分:0)

string mutexName = @"Global\OneComClientDb";
bool mutexWasCreated;
MutexSecurity mSec = new MutexSecurity();
MutexAccessRule rule = new MutexAccessRule(
      new SecurityIdentifier(WellKnownSidType.WorldSid, null),
      MutexRights.FullControl, AccessControlType.Allow);
mSec.AddAccessRule(rule);
mut = new Mutex(false, mutexName, out mutexWasCreated, mSec);

这是代码