Si tiene dos hilos dentro de una aplicación, y no desea que se ejecuten una determinada pieza de código al mismo tiempo, sólo puede poner un candado alrededor de la pieza de código, como esto:C#: ¿Cómo evitar que dos instancias de una aplicación hagan lo mismo al mismo tiempo?
lock (someObject) {
// ... some code
}
Pero ¿cómo haces lo mismo en procesos separados? Pensé que esto es lo que se utiliza un "mutex global" para, así que probé la clase Mutex
de varias maneras, pero no parece cumplir con mis necesidades, que son:
- Si usted es el único instancia, adelante y ejecute el código.
- Si es la segunda instancia, espere a que termine la primera, luego ejecute el código.
- No arroje excepciones.
problemas que se encontraron con:
- Sólo una instancia de un objeto
Mutex
en una cláusulausing(){...}
no parece hacer nada; las dos instancias todavía se ejecutan felizmente al mismo tiempo - Llamar a
.WaitOne()
en el Mutex hace que se ejecute la primera instancia y el segundo espere, pero el segundo espera indefinidamente, incluso después de las primeras llamadas.ReleaseMutex()
y deja el alcanceusing(){}
. .WaitOne()
arroja una excepción cuando el primer proceso sale (System.Threading.AbandonedMutexException
).
¿Cómo soluciono esto? Las soluciones que no involucran Mutex
son bienvenidas, especialmente porque Mutex
parece ser específico de Windows.
¿Está usando .NET, y se queja de que 'Mutex' es específico de Windows? –
@Anon .: http://www.mono-project.com/Main_Page – Randolpho
@Randolpho: cuyo objetivo es implementar toda la biblioteca .NET. Incluyendo 'System.Threading.Mutex'. Si es parte de la biblioteca .NET, puede esperar que se ejecute en cualquier plataforma .NET (incluido el mono, una vez que termine de implementar esa parte). –