Al depurar una aplicación que usa semáforos para la sincronización de procesos cruzados, me encontré con la idea de usar PowerShell para tomar el lugar del "otro" proceso. Hacer algo como esto en PowerShell funciona bien:Interactivamente usando Mutexes (et al) en Powershell
// In C# application:
var sem = new Semaphore(0, 1, "CrossProcSem");
sem.WaitOne();
# In PowerShell session:
[1] C:\Projects $ $sem = New-Object System.Threading.Semaphore(0, 1, "CrossProcSem")
[2] C:\Projects $ $sem.Release()
Y puede llamar WaitOne()
y Release()
varias veces en la misma instancia de un semáforo, tantas veces como lo necesite.
Pero cuando trato de hacer lo mismo con un objeto mutex, PowerShell continúa afirmando que el mutex fue abandonado:
[1] C:\Projects $ $mtx = New-Object System.Threading.Mutex($false, "CrossProcMtx")
[2] C:\Projects $ $mtx.WaitOne()
True
[3] C:\Projects $ $mtx.ReleaseMutex()
[4] C:\Projects $ $mtx.WaitOne()
Exception calling "WaitOne" with "0" argument(s): "The wait completed due to an abandoned mutex."
At line:1 char:13
+ $mtx.WaitOne <<<<()
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : DotNetMethodException
El error parece ocurrir en cualquier momento que llamo WaitOne()
después de haber adquirido el mutex una vez antes , ya sea una llamada anterior WaitOne
o pidiendo que sea propiedad inicialmente en el constructor:
[5] C:\Projects $ $mtx2 = New-Object System.Threading.Mutex($true)
[6] C:\Projects $ $mtx2.WaitOne()
Exception calling "WaitOne" with "0" argument(s): "The wait completed due to an abandoned mutex."
At line:1 char:14
+ $mtx2.WaitOne <<<<()
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : DotNetMethodException
[7] C:\Projects $ $mtx3 = New-Object System.Threading.Mutex
[8] C:\Projects $ $mtx3.WaitOne()
True
[9] C:\Projects $ $mtx3.WaitOne()
Exception calling "WaitOne" with "0" argument(s): "The wait completed due to an abandoned mutex."
At line:1 char:14
+ $mtx3.WaitOne <<<<()
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : DotNetMethodException
Is Powershell haciendo algunas travesuras hilo extraño en el fondo o solo estoy olvidando por completo la forma mutex w ork?
+1 - Estaba a punto de comentar sobre v3.0, ya que el ejemplo de OP me funcionó en el 3.0 CTP, y me di cuenta de que v3.0 (consola) era STA de forma predeterminada. Luego vi que hiciste eso también :) – manojlds
+1 Borra muestras. Respuesta clara. –
¿No puede simplemente proporcionar un nombre mutex "global", independientemente del MTA/STA de la instancia de Powershell? – Signal15