2009-06-16 5 views
5

J'ai un verrou dans mon code.
J'ai deux threads en cours d'exécution en même temps. Comment puis-je savoir si un thread verrouille cet objet?Comment puis-je savoir si un objet est verrouillé? C#

private readonly object _lockObject = new Object(); 

// Both methods running 
public void Method1() 
{ 
    if(certainCriteria) 
    { 
     lock(_lockObject) 
     { 
     //doWork; 
     } 
    } 
} 

// Both methods running 
public void Method2() 
{ 
    if(isLocked?(_lockObject)) 
    { 
     //doWork; 
    } 
} 

Quelqu'un at-il obtenu le isLocked? méthode?

Merci d'avance!

Répondre

8

Vous pourrait utiliser Monitor.TryEnter (soit avec un délai d'attente de 0, ou la surcharge qui ne prend pas un délai d'attente du tout), puis appelez immédiatement Monitor.Exit si elle réussit - mais je dirais que ce qui est généralement une mauvaise odeur de design. En particulier, les données sont périmées immédiatement vous le retournez.

Qu'essayez-vous d'accomplir?

+0

@Jon: Yaow est trop rapide, yaaw est (se lit mieux si vous pouvez gérer un accent de pays noir). C'était ce que j'allais suggérer avec une énorme mise en garde: «Cela fonctionne sur la base du« nous savons comment fonctionne la serrure ». – AnthonyWJones

+0

Je ne suis pas particulièrement dérangé par le fait que cela dépend de savoir comment fonctionne la serrure - ce n'est pas comme si ça allait changer. C'est juste que c'est complètement faux. J'ose dire qu'il y a * quelques * situations où c'est utile, mais probablement moins que les endroits où il est réellement utilisé! –

+0

Salut à nouveau Jon! J'implémente un BufferManager. Fondamentalement, il a une pile de tampons. Quand un thread pop() s la pile et il est vide - je veux que tous les threads attendent sur leur pop suivante() alors qu'un thread remplit la pile. Une fois rempli - tous les autres threads pour continuer à poping. Je ne suis pas sûr quant aux mécanismes de verrouillage de C# bien! – divinci

Questions connexes