Maison > développement back-end > C++ > L'utilisation de la variable « foreach » directement dans les fermetures multithread C# est-elle sûre ?

L'utilisation de la variable « foreach » directement dans les fermetures multithread C# est-elle sûre ?

Barbara Streisand
Libérer: 2025-01-22 06:56:12
original
685 Les gens l'ont consulté

Is Using the `foreach` Variable Directly in C# Multi-threaded Closures Safe?

foreach Variables et fermetures multithread en C# : sont-elles sûres ?

Lorsque vous utilisez foreach pour parcourir une collection en C#, il est crucial de comprendre la portée et le comportement des variables d'itération, en particulier dans un environnement multithread.

L'extrait de code suivant explore s'il est sûr d'utiliser des variables foreach directement comme arguments de fermeture en multithreading et si une copie locale doit être créée pour chaque itération.

Versions pré-C# 5

Dans les versions antérieures à C# 5, foreach les variables étaient déclarées en dehors de la boucle. Cela signifie qu'une seule instance de variable est partagée entre toutes les itérations.

Considérez le premier extrait de code :

<code class="language-csharp">foreach (Foo f in ListOfFoo)
{      
    Thread thread = new Thread(() => f.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>
Copier après la connexion

Dans cet exemple, la variable f est partagée entre tous les threads créés lors de l'itération de la boucle. Cela peut conduire à des résultats imprévisibles, car plusieurs threads peuvent finir par appeler des méthodes sur différentes instances de Foo, ou appeler des méthodes sur la même instance plusieurs fois.

Pour éviter de tels problèmes, il est recommandé de créer une copie locale de la variable f à chaque itération, comme indiqué dans le deuxième extrait de code :

<code class="language-csharp">foreach (Foo f in ListOfFoo)
{      
    Foo f2 = f;
    Thread thread = new Thread(() => f2.DoSomething());
    threads.Add(thread);
    thread.Start();
}</code>
Copier après la connexion

C# 5 et supérieur

C# 5 introduit des changements importants. En C# 5 et versions ultérieures, les variables foreach sont définies dans une portée de boucle. Cela signifie que chaque itération a sa propre instance de la variable.

Ainsi, les deux extraits de code deviennent équivalents et sûrs. Chaque fil de discussion possède désormais sa propre instance f dans sa portée de fermeture, éliminant ainsi le risque de confusion ou d'incohérence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal