Heim >Backend-Entwicklung >C++ >Warten Sie gegen Task.Wait: Warum verursacht die Verwendung von Task.wait Deadlocks?

Warten Sie gegen Task.Wait: Warum verursacht die Verwendung von Task.wait Deadlocks?

DDD
DDDOriginal
2025-02-02 02:51:08856Durchsuche

Await vs. Task.Wait: Why Does Using Task.Wait Cause Deadlocks?

und await: Die Wurzel des Deadlocks Task.Wait

und

Der Unterschied in der asynchronen Programmierung ist geringfügig wichtig. In diesem Artikel werden die Unterschiede zwischen den beiden untersucht und die gemeinsamen Deadlock -Szenen analysiert. await Task.Wait task.wait: synchrones Blockieren

decken Sie den aufrufenden Thread gleichzeitig ab, bis die Aufgabe abgeschlossen ist. Dies hat den Thread im Wesentlichen ausgesetzt und darauf gewartet, dass die Aufgabe ausgeführt wurde.

wartet: Asynchrones Hang

Task.Wait

Im Gegensatz dazu

die Ausführung der aktuellen Methode asynchron. Der Zustand der Methode wurde erfasst und eine unvollendete Aufgabe kehrte zum Anrufer zurück. Wenn der Warteausdruck abgeschlossen ist, soll der verbleibende Teil der Methode kontinuierlich betrieben werden. tote Lock -Szene

await Berücksichtigung der folgenden Code -Beispiele, bei denen der Fehler

zu einer toten Sperre verwendet wird:

In diesem Code blockiert die

-Methode den aktuellen Thread und wartet auf alle Aufgaben in der Sammlung. Jede -Methode enthält jedoch einen

-Ausdruck, der seine Ausführung hängt. Task.Wait

Wenn der aufrufende Thread in
<code>Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());</code>
blockiert ist, kann der Ausdruck

in der Aufgabe nicht abgeschlossen werden. Dies erzeugt tote Schlösser, da die Aufgabe weiterhin ausgeführt werden kann, es sei denn, der Anruf wird aufgerufen, um seine Behinderung zu veröffentlichen. Task.WaitAll Ros() Warum wartet der Block darauf, tote Schlösser zu vermeiden await

Verwenden von Obstruktionswartungen, wie beispielsweise Task.WaitAll oder sperren, wird in dieser Szene keine toten Schlösser verursachen, da sie nicht verhindert, dass die Aufgabe auf einem separaten Thread ausgeführt wird. Das Obstruktionswartung ist nur die Ausführung der Verzögerungsanrufmethode, sodass die Aufgabe fortgesetzt und schließlich abgeschlossen werden kann. await

Schlussfolgerung

Um tote Schlösser zu vermeiden, verstehen Sie den Unterschied zwischen

und

. Im Allgemeinen wird Thread.Sleep im asynchronen Code immer verwendet, um sicherzustellen, dass der aufrufende Thread beibehalten wird.

Das obige ist der detaillierte Inhalt vonWarten Sie gegen Task.Wait: Warum verursacht die Verwendung von Task.wait Deadlocks?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn