C# Language fermer à clé


Exemple

lock fournit la sécurité des threads pour un bloc de code, de sorte qu'il ne soit accessible que par un seul thread dans le même processus. Exemple:

private static object _lockObj = new object();
static void Main(string[] args)
{
    Task.Run(() => TaskWork());
    Task.Run(() => TaskWork());
    Task.Run(() => TaskWork());

    Console.ReadKey();
}

private static void TaskWork()
{
    lock(_lockObj)
    {
        Console.WriteLine("Entered");

        Task.Delay(3000);
        Console.WriteLine("Done Delaying");

        // Access shared resources safely

        Console.WriteLine("Leaving");
    }   
}

Output:

Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving

Cas d'utilisation:

Chaque fois que vous avez un bloc de code qui peut produire des effets secondaires s'il est exécuté par plusieurs threads en même temps. Le mot clé lock ainsi qu'un objet de synchronisation partagé ( _objLock dans l'exemple) peuvent être utilisés pour empêcher cela.

Notez que _objLock ne peut pas être null et que plusieurs threads exécutant le code doivent utiliser la même instance d'objet (en en faisant un champ static ou en utilisant la même instance de classe pour les deux threads)

Du côté du compilateur, le mot clé lock est un sucre syntaxique remplacé par Monitor.Enter(_lockObj); et Monitor.Exit(_lockObj); . Donc, si vous remplacez le verrou en entourant le bloc de code avec ces deux méthodes, vous obtiendrez les mêmes résultats. Vous pouvez voir le code réel dans le sucre syntaxique dans C # - exemple de verrouillage