C # mutex - erro chamando de ASP.NET e aplicativo de console

votos
6

Eu estou usando um mutex chamado global para sincronização de acesso de arquivo entre uma aplicação ASP.NET e um aplicativo de console.

Durante a execução do aplicativo ASP.NET, o aplicativo de console não consegue adquirir mutex - como esperado. Durante a execução do aplicativo de console, o aplicativo ASP.NET jogaUnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

Vou tentar capturar a exceção e tratá-lo como ele não conseguiu adquirir o mutex, mas eu quero saber por que é que se comportar como este? O aplicativo ASP.NET é executado como esperado se ele é acessado a partir de dois navegadores diferentes e os aplicativos de console também é executado como esperado quando executar várias instâncias.

Update: no Windows XP a exceção também é lançada quando o aplicativo ASP.NET está em execução e eu tento iniciar o aplicativo console.

O código usado para a sincronização está numa montagem comum:

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

  if(lock)
  {
    // ...

    m.ReleaseMutex();
  }
}

Ambiente: Windows Server 2008, IIS 7, ASP.NET 2.0

Publicado 10/12/2008 em 12:51
fonte usuário
Em outras línguas...                            


2 respostas

votos
11

você tem o direito de utilizador configurado para acesso aos recursos? utilização

MutexSecurity and MutexAccessRule ?

tente olhar para isso no MSDN http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity.aspx

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

ps Estou aguardando uma resposta Jon Skeet para mostrar minha ignorância no assunto ... =>

Respondeu 10/12/2008 em 12:58
fonte usuário

votos
6

Aqui, a amostra de Como determinar se uma instância anterior do meu aplicativo está sendo executado? (ver romkyns resposta ')

    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);
Respondeu 11/08/2010 em 08:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more