Wie bekomme ich den erwarteten Thread.Sleep?

139

Ich schreibe eine netzwerkgebundene Anwendung, die auf dem Wait / Sleep-Paradigma basiert.

Manchmal treten Verbindungsfehler auf, und meiner Erfahrung nach lohnt es sich, einige Zeit zu warten und den Vorgang dann erneut zu versuchen.

Das Problem ist, dass wenn ich Thread.Sleep oder eine andere ähnliche Blockierungsoperation in await / async verwende, alle Aktivitäten im Aufrufer-Thread blockiert werden.

Womit soll ich Thread.Sleep (10000) ersetzen, um den gleichen Effekt wie zu erzielen?

await Thread.SleepAsync(10000)

?

AKTUALISIEREN

Ich bevorzuge eine Antwort, die dies tut, ohne einen zusätzlichen Thread zu erstellen

Arsen Zahray
quelle

Antworten:

322

Die anderen Antworten, die darauf hindeuten, einen neuen Thread zu starten, sind eine schlechte Idee - das ist überhaupt nicht nötig. Ein Teil des Punktes von async/ awaitist zu reduzieren die Anzahl der Threads die Ihre Anwendung benötigt.

Sie sollten stattdessen verwenden, für Task.Delaydas kein neuer Thread erforderlich ist und der genau für diesen Zweck entwickelt wurde:

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);
Jon Skeet
quelle
Ich werde mich immer noch mit dem a4.5-Zeug auseinandersetzen. Wo ist der Ausführungszweig des Codes nach dieser Anweisung? Führt es der nicht schlafende / blockierende Teil aus oder der wartende 'Thread'? Verlässt die nicht blockierende Hauptausführung nur den folgenden Block (auch bekannt als return)?
Kenny
1
Ja. Dies ist genau das, was ich brauche
Arsen Zahray
1
@ Kenny: Sie können meine finden async Intro hilfreich. Wenn die erwartete Rückgabe von bearbeitet Task.Delaywird await, gibt die aktuelle Methode eine unvollständige Aufgabe zurück, da sie nicht vollständig ist. Später, wenn der DelayVorgang abgeschlossen ist (außerhalb eines Timers, nicht eines Threads), wird die Ausführung der restlichen Methode geplant. Die Fortsetzung läuft in einem "Kontext", der möglicherweise zu demselben ursprünglichen Thread zurückkehrt - Details in meinem Blog.
Stephen Cleary
@ StephenCleary danke dafür. Habe ich also Recht, wenn ich sage, dass der Code nach dem Warten für die Ausführung "geplant" ist und der aufrufende Thread zurückkehrt?
Kenny
2
Ja, der aufrufende Thread kehrt (sofort) und der Code nach dem awaitgeplanten (eventuell) zurück.
Stephen Cleary