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
Mary-Kate Olsenoriginal
2025-01-06 02:51:40761parcourir

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);
        }
    }
}

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:
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