2015-12-14 7 views
13

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.

+9

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

Antwort

4

Kann eine statische Funktion in einer statischen Klasse, die Ertragsrückgabe verwendet, um ein IEnumerable sicher von mehreren Threads abgerufen werden?

Die yield keyword macht die IEnumerable<T> Rückkehr Methode/Eigenschaft ein Iterator. Wenn materialisiert, wird es aufgerufen und intern wird IEnumerable.GetEnumerator() aufgerufen - was Thread-sicher ist. Dies gibt eine einzelne Instanz zurück.

Schauen Sie sich diese Erklärung: https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

Zusätzlich wurde dies in ähnlicher Weise gefragt here.

Verwandte Themen