Ich habe begonnen, asynchrones Programmieren in C # 5 und .Net 4.5 zu lernen, und da ist etwas, was ich nicht verstehe.
%Vor%Das Ergebnis ist:
%Vor%Gibt es also verschiedene Threads, die auf dieselbe Schleife zugreifen? Gibt es eine Race-Bedingung für die Indexvariable?
Nein, es gibt keine Wettlaufbedingung. Sie starten eine neue Aufgabe, die im Hintergrund ausgeführt wird, aber Ihr Code wird nicht fortgesetzt, bis diese Aufgabe abgeschlossen ist. Sie können also sicher sein, dass Ihr Code immer nur in einem Thread ausgeführt wird.
Da es sich jedoch um eine Konsolenanwendung handelt, gibt es kein aktuelles SyncronizationContext
. (Im Gegensatz zu einer Winform-, WPF-, ASP-, Silverlight- usw. Anwendung, in der dies der Fall sein wird.) Dies bedeutet, dass die Fortsetzungen von jedem await
-Aufruf im Thread-Pool und nicht im aufrufenden Thread ausgeführt werden. Also, ja, Sie laufen in einem der Thread-Pool-Threads in jeder Iteration der Schleife, und es könnte jedes Mal anders sein, aber Sie können sicher sein, dass Sie, mit Ausnahme dessen, was Sie in die neue Aufgabe einfügen, " "Beende" auf einem bestimmten Thread, bevor du mit der nächsten Arbeit beginnst, was sicherstellt, dass es immer nur einen Thread gibt, der Code zu einem bestimmten Zeitpunkt ausführt (was keine Rennbedingungen bedeutet).
Was Sie tun, ist nicht wirklich asyncronhron
%Vor%Dies erstellt eine Aufgabe und wartet dann darauf, dass diese Aufgabe abgeschlossen wird. Sie können auch einfach Thread.Sleep (10) hier aufrufen.
Ein geeigneterer Weg wäre:
%Vor% Wenn Sie eine Reihe von Aufgaben in einer Schleife ausführen möchten, sollten Sie sich die Methode Parallel.Foreach()
ansehen.
Tags und Links .net c# multithreading async-await asynchronous