Modifiez en toute sécurité les contrôles WPF dans d'autres threads via Dispatcher.Invoke
Dans les applications WPF, l'accès à l'interface utilisateur à partir du thread d'arrière-plan doit être traité avec prudence. La méthode Dispatcher.Invoke
fournit un mécanisme pour interagir en toute sécurité avec les contrôles d'un thread non principal.
Comprendre Dispatcher.Invoke
Dispatcher
est responsable de la gestion de la file d'attente des messages du fil de discussion de l'interface utilisateur. Le thread essayant d'accéder à un élément de l'interface utilisateur doit d'abord appeler la méthode Dispatcher.Invoke
pour effectuer l'opération requise sur le thread de l'interface utilisateur. Cela garantit que l’interface utilisateur reste réactive et que les mises à jour se déroulent sans problème.
Utilisez Dispatcher.Invoke
Pour modifier un contrôle WPF depuis un thread en arrière-plan :
<code class="language-csharp">Action<string> action = (text) => myLabel.Content = text;</code>
Dispatcher
, transmission du délégué et de la priorité de l'opération. Par exemple, pour exécuter un délégué en priorité en arrière-plan : <code class="language-csharp">Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, action, "Hello from another thread!" );</code>
Méthodes alternatives
Bien que Dispatcher.Invoke
puisse être utile dans certaines situations, il n'est pas recommandé pour les opérations de longue durée. Veuillez plutôt envisager d'utiliser les alternatives suivantes :
async
/await
) offrent un moyen plus simple et plus efficace de gérer les opérations asynchrones. Exemple de scène
Supposons que vous disposiez d'une application WPF qui récupère les données d'un service Web. Pour mettre à jour l'interface utilisateur avec les données récupérées, vous pouvez utiliser BackgroundWorker
pour télécharger les données en arrière-plan. Vous pouvez ensuite utiliser l'événement BackgroundWorker
de ReportProgress
pour appeler Dispatcher
et mettre à jour l'interface utilisateur :
<code class="language-csharp">backgroundWorker.ReportProgress(0, "Downloading data..."); Application.Current.Dispatcher.Invoke(() => myLabel.Content = "Data downloaded"); backgroundWorker.ReportProgress(100, "Download complete");</code>
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!