当前位置:  开发笔记 > 编程语言 > 正文

C#mutex - 从ASP.NET和控制台应用程序调用错误

如何解决《C#mutex-从ASP.NET和控制台应用程序调用错误》经验,为你挑选了2个好方法。

我使用全局命名的互斥锁来实现ASP.NET应用程序和控制台应用程序之间的文件访问同步.

在运行ASP.NET应用程序时,控制台应用程序无法获得互斥锁 - 正如预期的那样.在运行控制台应用程序时,ASP.NET应用程序将抛出UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

我将尝试捕获异常并将其视为未能获取互斥锁,但我想知道为什么它会像这样?如果从两个不同的浏览器访问ASP.NET应用程序,并且运行多个实例时控制台应用程序也按预期运行,则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



1> 小智..:

你有合适的用户设置来访问资源吗?运用

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

ps我正在等待Jon Skeet的回答,表明我对此事的无知...... =>


我的"回答"只是给你+1,因为它看起来对我来说完全正确:)
我一天的高潮 - Jon Skeet跟我说话=>并且同意快乐的一天

2> Vladislav..:

这里的示例如何确定我的应用程序的先前实例是否正在运行?(见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);

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有