Kann eine statische Funktion in einer statischen Klasse, die yield return
verwendet, um ein IEnumerable sicher aus mehreren Threads aufgerufen werden?Ist Rendite zurückkehrend?
Erhält jeder Thread, der diesen Aufruf aufruft, immer einen Verweis auf jedes Objekt in der Sammlung? In meiner Situation wird listOfFooClassWrappers
einmal am Anfang des Programms geschrieben, so dass ich mich nicht darum kümmern muss, dass es sich während eines Anrufs auf diese Funktion ändert. Ich habe ein einfaches Programm geschrieben, um das zu testen, und ich habe keine Anzeichen von Problemen gesehen, aber Threading-Probleme können schwer zu erraten sein und es ist möglich, dass das Problem während der Läufe nicht auftrat.
EDIT: Is yield return in C# thread-safe? ist ähnlich, sondern adressiert die Situation, in der die Sammlung geändert wird, während iteriert wird. Meine Bedenken haben mehr damit zu tun, dass mehrere Threads aufgrund eines versteckten gemeinsamen Iterators nur einen Teil der Sammlung erhalten, da die Klasse und Methode beide statisch sind.
Ja. http://stackoverflow.com/questions/1379266/is-yield-return-in-c-sharp-thread-safe, https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes- of-the-c-yield-keyword /, http://stackoverflow.com/questions/4157771/thread-safety-of-yield-return-is-it Jeder Thread, der 'FooClassObjects.GetEnumerator()' aufruft (zB ' foreach (var foo in FooClassObjects) ') erhält einen eigenen Enumerator, der auf seiner eigenen Kopie der Zustandsmaschine arbeitet, in die eine Methode, die' yield return' enthält, hineinkompiliert wird. – CodeCaster