Comprendre Task<T>.Result
et await Task<T>
en programmation asynchrone
En programmation asynchrone, le choix entre await Task<T>
et Task<T>.Result
a un impact significatif sur les performances et la gestion des exceptions. Examinons les principales différences.
La méthode GetName
illustre les deux approches :
Utilisation de Task<T>.Result
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return nameTask.Result; }</code>
nameTask.Result
bloque le fil de discussion en cours jusqu'à ce que la tâche soit terminée. Ceci est inefficace pour les opérations de longue durée, car cela peut provoquer le gel des applications.
Utilisation de await Task<T>
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return await nameTask; }</code>
await nameTask
libère le thread appelant, permettant à d'autres tâches de s'exécuter simultanément. La méthode ne reprend que lorsque nameTask
se termine.
Distinctions critiques :
Task<T>.Result
blocs ; await Task<T>
ne le fait pas.await Task<T>
propage directement les exceptions ; Task<T>.Result
les enveloppe dans un AggregateException
.Bonnes pratiques :
Task.Factory.StartNew
pour les tâches en arrière-plan ; utilisez Task.Run
à la place pour une efficacité améliorée et une meilleure intégration avec le pool de threads .NET.Task<T>.Result
et Task.Factory.StartNew
puissent être utilisés pour le parallélisme dynamique des tâches, ils sont généralement déconseillés dans des contextes de programmation asynchrone au profit de await
pour une meilleure réactivité et maintenabilité. L'utilisation de await
est l'approche préférée et la plus robuste pour les opérations asynchrones.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!