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