Cet article clarifie l'utilisation optimale de async-await
et Task.Run
pour empêcher l'interface utilisateur dans la programmation asynchrone. Comprendre leurs différences est la clé pour maintenir une interface utilisateur réactive.
Différences de clés et quand utiliser chaque
Les opérations asynchrones sont cruciales pour prévenir le blocage de l'interface utilisateur. Cependant, le choix entre Task.Run
et async-await
dépend de la nature de l'opération:
Task.Run
Pour les opérations liées au CPU: Utilisez Task.Run
lors de la gestion des tâches intensives en calcul qui autrement attacheraient le thread d'interface utilisateur. Le déchargement sur un fil d'arrière-plan assure la réactivité de l'interface utilisateur.
Async-Await
pour les opérations liées aux E / O: Async-await
est idéale pour les opérations d'E / S (requêtes réseau, accès au fichier) qui, tout en prenant du temps, ne vous chargez pas fortement le CPU. Async-await
permet au fil d'interface utilisateur de rester réactif pendant ces attentes.
meilleures pratiques pour les performances optimales
ConfigureAwait(false)
: Utilisez await Task.Run(() => MyAsync()).ConfigureAwait(false);
pour éviter que le contexte inutile ne revienne au thread d'interface utilisateur une fois la tâche d'arrière-plan terminée. Cela libère le fil d'interface utilisateur pour d'autres tâches.
déchargez le travail lié au CPU: Utilisez toujours await Task.Run(() => DoWork());
pour exécuter des méthodes à forte intensité de CPU sur un thread d'arrière-plan, empêchant le retard de l'interface utilisateur.
Évitez Task.Run
dans les bibliothèques: Pour le code de bibliothèque réutilisable, évitez d'intégrer Task.Run
. Au lieu de cela, laissez le code d'appel décider de l'utiliser en fonction des caractéristiques de l'opération spécifique. Cela améliore la flexibilité et la réutilisabilité du code.
Exemple illustratif
Considérons un WPF PageViewModel
et ContentLoader
:
public class PageViewModel : IHandle<somemessage> { public async void Handle(SomeMessage message) { ShowLoadingAnimation(); await this.contentLoader.LoadContentAsync().ConfigureAwait(false); HideLoadingAnimation(); } } public class ContentLoader { public async Task LoadContentAsync() { await Task.Run(() => DoCpuBoundWorkAsync()); await DoIoBoundWorkAsync(); await DoSomeOtherWorkAsync(); } }
Ici, DoCpuBoundWorkAsync()
est géré efficacement par Task.Run
, en maintenant la réactivité de l'interface utilisateur. ConfigureAwait(false)
s'assure que le thread d'interface utilisateur n'est pas bloqué inutilement pendant les appels await
. Cette approche démontre les meilleures pratiques pour équilibrer les opérations asynchrones et la réactivité de l'interface utilisateur.
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!