Maison >développement back-end >C++ >Comment mettre à jour une interface utilisateur WPF à partir d'un thread distinct dans une classe différente ?

Comment mettre à jour une interface utilisateur WPF à partir d'un thread distinct dans une classe différente ?

DDD
DDDoriginal
2025-01-05 18:57:43377parcourir

How to Update a WPF UI from a Separate Thread in a Different Class?

Mise à jour de l'interface utilisateur à partir d'un thread distinct dans une classe différente

Q : Comment mettre à jour une interface utilisateur WPF à partir d'un thread de travail exécuté dans une classe distincte ?

A : Pour mettre à jour l'interface utilisateur à partir d'un autre thread :

  1. Utilisez Dispatcher.Invoke : Appelez cette méthode dans la classe de travail pour mettre à jour les éléments de l'interface utilisateur sur le thread principal.
  2. Communication basée sur les événements :

    • Créer des événements dans la classe des travailleurs pour déclencher des notifications d'interface utilisateur mises à jour.
    • Enregistrez les gestionnaires de ces événements dans la classe de la fenêtre principale.
    • Distribuez les mises à jour de l'interface utilisateur dans les gestionnaires d'événements.

Exemple d'utilisation d'événements :

// Main window class
private void startCalc(object sender, RoutedEventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Register event handler to receive UI update notifications
    calc.ProgressUpdate += (s, e) =>
    {
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    };
    
    // Start the worker thread
    Thread calcThread = new Thread(new ParameterizedThreadStart(calc.TestMethod));
    calcThread.Start(input);
}

// Worker class
public class CalcClass
{
    public event EventHandler ProgressUpdate;

    public void TestMethod(object input)
    {
        // Perform calculations
        
        // Raise event to notify UI update
        if (ProgressUpdate != null)
            ProgressUpdate(this, new EventArgs());
    }
}

Supplémentaire Remarque :

Solution alternative utilisant Task :
Dans .NET 4.5 et versions ultérieures, vous pouvez également utiliser la programmation asynchrone avec Task pour mettre à jour l'interface utilisateur de manière plus propre et plus efficace. manière.

Code mis à jour à l'aide de la tâche :

// Main window class
private async void buttonDoCalc_Clicked(object sender, EventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Start the asynchronous calculation
    await calc.CalcAsync();
}

// Worker class
public class CalcClass
{
    public async Task CalcAsync()
    {
        // Perform calculations
        
        // Update UI using Dispatcher.Invoke
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    }
}

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