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

Comment mettre à jour en toute sécurité une interface graphique à partir d'un fil d'arrière-plan en C# ?

Mary-Kate Olsen
Libérer: 2025-01-10 09:32:41
original
982 Les gens l'ont consulté

How to Safely Update a GUI from a Background Thread in C#?

Guide de mise à jour de la sécurité des threads C# GUI

Description du problème

La mise à jour de l'interface graphique à partir d'un fil d'arrière-plan est un problème délicat. Tenter de le faire directement peut entraîner un comportement inhabituel ou inattendu.

Solution BackgroundWorker

1. Configuration initiale : Instanciez un BackgroundWorker et configurez ses gestionnaires d'événements.

private BackgroundWorker _backgroundWorker;

_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += backgroundWorker_DoWork;
_backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
_backgroundWorker.WorkerReportsProgress = true;
Copier après la connexion

2. Tâches en arrière-plan : Dans le gestionnaire d'événements DoWork, exécutez des tâches de longue durée et signalez périodiquement la progression.

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // ... 执行你的任务
    object param = "一些数据";
    _backgroundWorker.ReportProgress(0, param);
}
Copier après la connexion

3. Rapport d'avancement : Dans le gestionnaire d'événements ProgressChanged, mettez à jour l'interface graphique avec la progression signalée.

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // 使用e.ProgressPercentage和e.UserState更新UI
}
Copier après la connexion

Tâche en cours

4. Démarrez la tâche en arrière-plan : Appelez RunWorkerAsync pour démarrer la tâche en arrière-plan.

_backgroundWorker.RunWorkerAsync();
Copier après la connexion

5. Planification continue (facultatif) : Si vous devez répéter la tâche régulièrement, vous pouvez ajouter le code suivant dans le gestionnaire d'événements RunWorkerCompleted.

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // UI 更新
    Thread.Sleep(10000);
    Update();
}
Copier après la connexion

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