Beim Debuggen einer Anwendung, die Semaphore für die prozessübergreifende Synchronisierung verwendet, stolperte ich über die Idee, PowerShell anstelle des "anderen" Prozesses zu verwenden. So etwas in PowerShell zu tun funktioniert gut:
%Vor% Und ich kann WaitOne()
und Release()
wiederholt für dieselbe Instanz eines Semaphors aufrufen, so oft ich es brauche.
Aber wenn ich versuche, dasselbe mit einem Mutex zu machen, behauptet PowerShell, dass der Mutex aufgegeben wurde:
%Vor% Der Fehler scheint jedes Mal zu passieren, wenn ich WaitOne()
aufruft, nachdem ich den Mutex einmal zuvor erworben habe, entweder einen vorherigen WaitOne
Aufruf oder ob er anfänglich im Konstruktor enthalten ist:
Macht Powershell im Hintergrund seltsame Thread Shenanigans oder vergesse ich einfach komplett, wie Mutexes funktioniert?
Standardmäßig verwendet Powershell v2.0 (an der Konsole, nicht am grafischen ISE) einen MTA-Threadpool. Das bedeutet, dass jede interaktive Zeile in einem anderen Thread ausgeführt wird:
%Vor%Ein nicht interaktives Skript wird jedoch unter einem einzelnen Thread ausgeführt, dh dem Thread, der den Befehl zum Ausführen aufgerufen hat:
%Vor%Wenn Sie die Powershell interaktiv mit einem einzelnen Thread ausführen möchten, starten Sie die Shell mit dem Schalter -STA. Sie können dies interaktiv tun:
%Vor%Wie Sie sehen können, verwendet Powershell ein single-threaded Apartment, um interaktive Befehle auszuführen. Dies ist normalerweise die gewünschte Wahl für die Arbeit mit WPF oder WinForms oder wenn Sie mit systemweiten Mutexen spielen möchten:
%Vor%BTW, powershell v3 (Versand mit Windows 8 und auch downlevel bei Win 7) verwendet -STA als Standardmodus für die Konsole. Die grafische Powershell-ISE verwendet immer -STA, sowohl in v2 als auch in v3.
Tags und Links .net multithreading powershell