Heim > Backend-Entwicklung > C++ > Async -Programmierung: `task.waitall` Deadlock: Was verursacht sie und wie unterscheidet es sich von der Verwendung von` Awit`?

Async -Programmierung: `task.waitall` Deadlock: Was verursacht sie und wie unterscheidet es sich von der Verwendung von` Awit`?

DDD
Freigeben: 2025-02-02 02:46:11
Original
379 Leute haben es durchsucht

Async Programming:  `Task.WaitAll` Deadlock: What Causes It and How Does It Differ from Using `await`?

Asynchrones Programmieren:

Vergleich mit und potenziellen toten Schlössern await Task.WaitAll Der Unterschied zwischen und

kann verwirrend sein. Um dies zu erklären, schauen wir uns eine Szene in einem ASP.NET -Webapi -Dienst an:

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>
Nach dem Login kopieren

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, die den Thread blockiert und auf alle Aufgaben wartet. Bei diesen Aufgaben ruft die "ROS" -Methode jedoch

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage