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

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

Mary-Kate Olsen
Libérer: 2025-01-06 02:51:40
original
778 Les gens l'ont consulté

How to Safely Update a WPF UI from a Separate Background Thread?

Comment mettre à jour l'interface utilisateur à partir d'un autre thread exécuté dans une autre classe

Énoncé du problème :

Dans un WPF multithread application, il est nécessaire de mettre à jour l’interface utilisateur à partir d’un thread d’arrière-plan exécuté dans une classe distincte. L'objectif est de garder l'interface utilisateur réactive pendant que de longs calculs sont effectués.

Solution utilisant la répartition d'événements :

  1. Répartition à partir du fil de discussion en arrière-plan : Dans le thread d'arrière-plan, utilisez Dispatcher.Invoke pour exécuter un délégué sur le thread de l'interface utilisateur. Cette approche vous permet d'effectuer des mises à jour de l'interface utilisateur directement à partir de l'autre fil de discussion.
  2. Gérer la répartition dans la classe UI : Enregistrez un gestionnaire d'événements dans la classe UI pour recevoir la demande de mise à jour de l'interface utilisateur. Dans le gestionnaire d'événements, utilisez l'action Invoquer pour mettre à jour l'interface utilisateur.

Exemple de code :

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void startCalc(object sender, RoutedEventArgs e)
    {
        inputValues input = new inputValues();

        calcClass calculations = new calcClass();

        try
        {
            // Parse user inputs
        }
        catch
        {
            // Handle input errors
        }

        // Register event handler
        calculations.ProgressUpdate += OnProgressUpdate;

        // Start background calculations
        Thread calcthread = new Thread(
            new ParameterizedThreadStart(calculations.testMethod));
        calcthread.Start(input);
    }

    private void OnProgressUpdate(object sender, YourEventArgs args)
    {
        Dispatcher.Invoke((Action)delegate()
        {
            // Update UI based on event arguments
        });
    }
}

public class calcClass
{
    public event EventHandler<YourEventArgs> ProgressUpdate;

    public void testmethod(inputValues input)
    {
        for (int i = 0; i < 1000; i++)
        {
            // Perform calculations

            // Raise ProgressUpdate event when needed
            if (ProgressUpdate != null)
                ProgressUpdate(this, new YourEventArgs(status));

            Thread.Sleep(10);
        }
    }
}
Copier après la connexion

Avantages de la répartition des événements :

  • Simple à mettre en œuvre
  • Permet un contrôle précis sur l'interface utilisateur mises à jour
  • Maintient une séparation nette entre le code UI et non-UI

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 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal