2012-04-09 5 views
1

Dans un débogueur je "gelé" lors de l'exécution de cette ligne de code: lock (myvar) Évidemment, quelqu'un d'autre détient myvar. Cependant, je m'attends à ce que cette ligne myvar devrait être libre. Donc, je veux savoir quelle partie du code détient myvar (à partir d'un autre thread diffenetely). Comment puis je faire ça? Je sais quel fil le tient (parce que je n'ai qu'un autre fil) mais je ne sais pas où.comment résoudre: pourquoi je ne peux pas obtenir un verrou?

UPD résolu, j'ai oublié d'appeler Monitor.Exit(myvar) après un Monitor.TryEnter(myvar)

+1

Juste combien de déclarations de verrouillage que votre code ont ?? –

+0

@AndrewBarber J'ai seulement une autre déclaration de verrouillage et je ne comprends pas comment il peut garder le verrou. Donc je veux m'assurer que dans le débogueur ce problème est là .... J'ai décidé d'ajouter Console.Writeln ("get lock") et Console.Writeln ("release lock") traçage ... – javapowered

+0

Ceux 'Console. Writeline() 's sont assez chers et pourraient changer le timing. –

Répondre

2

La déclaration lock() utilise la classe Monitor qui ne supporte pas les fils de l'interrogation verrouillage.
Dans Fx 4.5, vous pouvez vérifier Monitor.IsEntered(myVar) mais c'est à peu près tout.

Le reste devrait provenir de la logique de votre code.

+0

Il existe une méthode 'Monitor.IsEnter'? – Jon

+0

@Jon Seulement si vous utilisez .NET 4.5. – hangy

+0

@Jon - seulement dans la dernière version. Édité. –

3

Si vous utilisez Visual Studio 2010 vous pouvez regarder sur Parallel Stacks

+0

comment l'utiliser je peux trouver des fils ou des endroits qui "verrouillent" ma variable? – javapowered

+0

Vous pouvez voir quels threads sont en cours d'exécution * maintenant * peut réduire/localiser la recherche ... La même chose que 'Monitor.IsEntered' il vous informe que le' Monitor' déjà verrouillé, mais par qui est une autre question ... – Tigran

Questions connexes