Czy istnieje sposób sprawdzenia, czy bieżący wątek trzyma blokadę monitora na obiekcie? To znaczy. odpowiednik Thread.holdsLock w Javie.Jak sprawdzić, czy wątek trzyma blokadę obiektu w C#?
Dzięki,
Czy istnieje sposób sprawdzenia, czy bieżący wątek trzyma blokadę monitora na obiekcie? To znaczy. odpowiednik Thread.holdsLock w Javie.Jak sprawdzić, czy wątek trzyma blokadę obiektu w C#?
Dzięki,
Nie wierzę, że istnieje. Są groteskowe rzeczy, które można zrobić, nazywając Monitor.Wait(monitor, 0)
i łapiąc SynchronizationLockException
, ale to dość okropne (i teoretycznie "złapać" puls, na który czekała inna nitka).
Proponuję spróbować przeprojektować tak, abyś tego nie potrzebował, obawiam się.
EDYCJA: W .NET 4.5 jest dostępna pod adresem Monitor.IsEntered
.
Odpowiednie informacje są przechowywane przez strukturę SyncBlock używaną przez CLR i można je wyświetlić podczas debugowania za pomocą np. WinDbg + sos. Według mojej wiedzy nie ma sposobu, aby uzyskać informacje z kodu zarządzanego, ale może być to możliwe z niebezpiecznego kodu zakładając, że możesz jakoś (i w niezawodny sposób) uzyskać wskaźnik do odpowiednich danych używanych przez CLR.
Dziękuję Jonowi, na szczęście nie próbujemy go użyć, to tylko coś, co wpadło mi do głowy, gdy czytałem artykuły na temat wątków w C# :-P – theburningmonk
cześć Jon, w C# 4.5 jest to teraz możliwe z [Monitor.IsEntered (Object obj)] (http://msdn.microsoft.com/en-us/library/system.threading.monitor.isentered.aspx) prawda? – Ben
@Ben: Zakładając, że masz na myśli .NET 4.5, tak. Dokona edycji. –