<p>L’instruction <code>lock</code> est traduite par C# 3.0 en ceci :</p>
<pre><code class="lang-auto">var temp = obj;
Monitor.Enter(temp);
try
{
// body
}
finally
{
Monitor.Exit(temp);
}
</code></pre>
<p>En C# 4.0, <a href="https://ericlippert.com/2009/03/06/locks-and-exceptions-do-not-mix/">cela a change</a> et c’est maintenant genere comme suit :</p>
<pre><code class="lang-auto">bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
// body
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
</code></pre>
<p>Vous pouvez trouver plus d’informations sur ce que fait <code>Monitor.Enter</code> <a href="https://learn.microsoft.com/dotnet/api/system.threading.monitor.enter#System_Threading_Monitor_Enter_System_Object_">ici</a>. Pour citer MSDN :</p>
<p>Utilisez <code>Enter</code> pour acquerir le Monitor sur l’objet passe en parametre. Si un autre thread a execute un <code>Enter</code> sur l’objet mais n’a pas encore execute le <code>Exit</code> correspondant, le thread actuel se bloquera jusqu’a ce que l’autre thread libere l’objet. Il est legal pour le meme thread d’invoquer <code>Enter</code> plus d’une fois sans se bloquer ; cependant, un nombre egal d’appels a <code>Exit</code> doit etre invoque avant que les autres threads en attente sur l’objet ne soient debloques.</p>
<p>La methode <code>Monitor.Enter</code> attendra indefiniment ; elle n’expirera <em>pas</em>.</p>