Asynchrones Programmieren:
Vergleich mit und potenziellen toten Schlössern await
Task.WaitAll
Der Unterschied zwischen und
Task.Wait
await
In dieser Szene wird erwartet, dass die "GET" -Methode einen Deadlock aufweist. Was ist der grundlegende Grund? Was ist der Unterschied zwischen der Verwendung von Obstruktion und Warten und nicht zwischen
<code class="language-csharp">public async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { "value1", "value2" }; // 由于死锁而从未执行 }</code>
Unterschiede: await Task.Delay
und
Wait
und await
übernehmen ähnliche konzeptionelle Rollen, aber ihre Funktionen sind unterschiedlich. blockiert den aktuellen Thread, bis die Aufgabe abgeschlossen ist. Diese Methode ist nicht ratsam, da sie den Fadenpool verhungert.
Im Gegenteil wird asynchron pausiert, um Methoden auszuführen. Der aktuelle Zustand der Methode wird erfasst, und diese Methode gibt seine unvollendeten Aufgaben an den Anrufer zurück. Nach Abschluss der Aufgabe wird der Rest der Methode als Fortsetzung geplant. Task.Wait
await
Task.Wait
Die potenziellen toten Schlösser und asynchroner Missionen
await
In dem angegebenen Codefragment ruft die "GET" -Methode
auf, wodurch die Ausführung ausgesetzt wird. Infolgedessen wurde die Aufgabe nicht erledigt und der Thread wurde im Aufruf noch blockiert. Dies führt zu toten Schlössern. Task.WaitAll
Verwenden Sie die asynchrone Programmierung, um tote Sperren zu vermeiden.
Task.WaitAll
Um dieses Problem zu lösen, muss eine asynchrone Programmierung verwendet werden, insbesondere wenn es sich um Verzögerungs- und Suspensionsaufgaben handelt. Durch die Kombination der Verwendung von Schlüsselwörtern und await Foo
kann der Code die Antwortfähigkeit beibehalten und tote Schlösser verhindern. WaitAll
Das obige ist der detaillierte Inhalt vonAsync -Programmierung: `task.waitall` Deadlock: Was verursacht sie und wie unterscheidet es sich von der Verwendung von` Awit`?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!