Maison >développement back-end >C++ >Comment puis-je mettre à jour en toute sécurité une interface utilisateur WPF à partir d'un fil de discussion en arrière-plan ?

Comment puis-je mettre à jour en toute sécurité une interface utilisateur WPF à partir d'un fil de discussion en arrière-plan ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-11 21:17:47834parcourir

How Can I Safely Update a WPF UI from a Background Thread?

Mises à jour de l'interface utilisateur WPF Thread-Safe : un guide pratique

Les applications WPF nécessitent une gestion minutieuse des mises à jour de l'interface utilisateur à partir des threads d'arrière-plan. L'accès direct aux éléments de l'interface utilisateur à partir d'un thread d'arrière-plan n'est pas sécurisé et peut provoquer une instabilité ou des plantages de l'application. En effet, les éléments de l'interface utilisateur sont intrinsèquement liés au thread principal de l'application.

Considérons un scénario dans lequel un observateur du système de fichiers met à jour une grille de données avec des entrées de fichier journal. Tenter d'ajouter une nouvelle ligne directement (par exemple, dataGridRows.Add(ds)) dans le gestionnaire d'événements de l'observateur sur un fil d'arrière-plan est incorrect.

La solution réside dans l'utilisation de la classe Dispatcher. Le Dispatcher fournit un mécanisme pour organiser l'exécution du code vers le thread principal, garantissant ainsi la sécurité des threads. La méthode Dispatcher.Invoke est essentielle ici.

Voici comment modifier le gestionnaire d'événements watcher_Changed pour mettre à jour la grille de données en toute sécurité :

<code class="language-csharp">private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    if (File.Exists(syslogPath))
    {
        string line = GetLine(syslogPath, currentLine);
        foreach (CommRuleParser crp in crpList)
        {
            FunctionType ft = new FunctionType();
            if (crp.ParseLine(line, out ft))
            {
                Application.Current.Dispatcher.Invoke(() => DGAddRow(crp.Protocol, ft));
            }
        }
        currentLine++;
    }
    else
    {
        MessageBox.Show(UIConstant.COMM_SYSLOG_NON_EXIST_WARNING);
    }
}</code>

En utilisant Application.Current.Dispatcher.Invoke, la méthode DGAddRow est exécutée sur le thread principal. Cela garantit un accès sécurisé à la grille de données et évite les conflits de threads. Cette approche garantit que toutes les mises à jour de l'interface utilisateur sont traitées correctement et évite les plantages potentiels ou les comportements imprévisibles.

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!

Déclaration:
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