代码之家  ›  专栏  ›  技术社区  ›  alexandrul

C#互斥-从ASP.NET和控制台应用程序调用时出错

  •  6
  • alexandrul  · 技术社区  · 17 年前

    我在ASP.NET应用程序和控制台应用程序之间使用名为mutex的全局文件访问同步。

    UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

    我将尝试捕获异常并将其视为无法获取互斥体,但我想知道它为什么会出现这种情况?如果从两个不同的浏览器访问ASP.NET应用程序,则该应用程序将按预期运行;如果运行多个实例,则控制台应用程序也将按预期运行。

    在Windows XP上,当ASP.NET应用程序正在运行并且我尝试启动控制台应用程序时,也会引发异常。

    用于同步的代码位于公共程序集中:

    using (Mutex m = new Mutex(false, "Global\\TheNameOfTheMutex")) // exception thrown
    {
      try
      {
        lock = m.WaitOne(0, false);
      }
      catch (AbandonedMutexException)
      {
        // ...
      }
    
      if(lock)
      {
        // ...
    
        m.ReleaseMutex();
      }
    }
    

    环境:Windows Server 2008、IIS 7、ASP.NET 2.0

    2 回复  |  直到 17 年前
        1
  •  11
  •   littlegeek littlegeek    17 年前

    您是否设置了访问资源的正确用户?使用

    MutexSecurity and MutexAccessRule ?
    

    试试看MSDN上的这个 http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity.aspx

    http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexaccessrule.aspx

    p、 我正在等待Jon Skeet的答复,以表明我对此事的无知…=>

        2
  •  7
  •   Community Mohan Dere    9 年前

    这是我们的样品 How to determine if a previous instance of my application is running? romkyns "答)

        var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
        var mutexsecurity = new MutexSecurity();
        mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow));
        mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.ChangePermissions, AccessControlType.Deny));
        mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.Delete, AccessControlType.Deny));
        _mutex = new Mutex(false, "Global\\YourAppName-{add-your-random-chars}", out created, mutexsecurity);