Maison > développement back-end > C++ > Programmation asynchrone: `Task.WaitAll` Impate: qu'est-ce qui les cause et en quoi diffère-t-il de l'utilisation de« Wait »?

Programmation asynchrone: `Task.WaitAll` Impate: qu'est-ce qui les cause et en quoi diffère-t-il de l'utilisation de« Wait »?

DDD
Libérer: 2025-02-02 02:46:11
original
377 Les gens l'ont consulté

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

Programmation asynchrone:

Comparaison avec et les verrous morts potentiels await Task.WaitAll La différence entre et

peut être confuse. Pour expliquer cela, jetons un coup d'œil à une scène dans un service WebAPI ASP.NET:

Task.Wait await Dans cette scène, la méthode "Get" devrait avoir une impasse. Quelle est la raison fondamentale? Quelle est la différence entre l'utilisation d'obstruction et d'attente plutôt que

?
<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>
Copier après la connexion

Différences: await Task.Delay et

Wait et await assumer des rôles conceptuels similaires, mais leurs fonctions sont différentes. bloquera le thread actuel jusqu'à la fin de la tâche. Cette méthode n'est pas recommandée car elle affiche le pool de threads.

au contraire, sera mis en pause asynchrone pour exécuter des méthodes. L'état actuel de la méthode est capturé et cette méthode renverra ses tâches inachevées à l'appelant. Une fois la tâche terminée, le reste de la méthode sera planifiée comme continuation. Task.Wait await Task.Wait Les serrures mortes potentielles et les missions asynchrones

await Dans le fragment de code fourni, la méthode "Get" appelle

, qui bloquera le thread et attendra que toutes les tâches se terminent. Cependant, dans ces tâches, la méthode "ROS" appelle

, qui suspendre son exécution. En conséquence, la tâche n'a pas été terminée et le fil a toujours été bloqué dans l'appel . Cela provoquera des serrures mortes. Task.WaitAll Utiliser la programmation asynchrone pour éviter les verrous morts

Task.WaitAll Afin de résoudre ce problème, la programmation asynchrone doit être utilisée, en particulier lorsqu'il s'agit de tâches de retard et de suspension. En combinant l'utilisation des mots clés et await Foo, le code peut maintenir la capacité de réponse et empêcher les verrous morts. WaitAll

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal