Nachdem ich mich eine Weile mit dem asynchronen / wartenden Muster von C # befasst hatte, wurde mir plötzlich klar, dass ich nicht wirklich weiß, wie ich erklären soll, was im folgenden Code passiert:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
Es wird angenommen, dass ein Wartender zurückgegeben wird, Task
der möglicherweise einen Threadwechsel verursacht oder nicht, wenn die Fortsetzung ausgeführt wird.
Ich wäre nicht verwirrt, wenn das Warten nicht in einer Schleife wäre. Ich würde natürlich erwarten, dass der Rest der Methode (dh die Fortsetzung) möglicherweise auf einem anderen Thread ausgeführt wird, was in Ordnung ist.
Innerhalb einer Schleife wird das Konzept des "Restes der Methode" für mich jedoch etwas neblig.
Was passiert mit "dem Rest der Schleife", wenn der Thread auf Fortsetzung geschaltet ist oder wenn er nicht geschaltet ist? Auf welchem Thread wird die nächste Iteration der Schleife ausgeführt?
Meine Beobachtungen zeigen (nicht endgültig verifiziert), dass jede Iteration auf demselben Thread (dem ursprünglichen) beginnt, während die Fortsetzung auf einem anderen ausgeführt wird. Kann das wirklich sein? Wenn ja, ist dies dann ein Grad unerwarteter Parallelität, der im Hinblick auf die Thread-Sicherheit der GetWorkAsync-Methode berücksichtigt werden muss?
UPDATE: Meine Frage ist kein Duplikat, wie von einigen vorgeschlagen. Das while (!_quit) { ... }
Codemuster ist lediglich eine Vereinfachung meines tatsächlichen Codes. In Wirklichkeit ist mein Thread eine langlebige Schleife, die ihre Eingabewarteschlange mit Arbeitselementen in regelmäßigen Abständen (standardmäßig alle 5 Sekunden) verarbeitet. Die tatsächliche Beendigungsbedingungsprüfung ist auch keine einfache Feldprüfung, wie im Beispielcode vorgeschlagen, sondern eine Ereignishandle-Prüfung.