Le problème :
Les opérations de base de données de longue durée peuvent geler la fenêtre principale de votre application, rendant la barre de progression insensible. Cela se produit parce que la tâche de base de données bloque le thread principal de l'interface utilisateur.
BackgroundWorkers et multithreading :
La classe BackgroundWorker
offre une solution en déchargeant les tâches longues vers un thread séparé, préservant ainsi la réactivité de l'interface utilisateur. Cependant, il est crucial de gérer correctement les mises à jour de l'interface utilisateur à partir de ce fil de discussion en arrière-plan.
Mettre à jour l'interface utilisateur en toute sécurité :
La modification des éléments de l'interface utilisateur nécessite l'utilisation du répartiteur du thread principal. La mise à jour directe des contrôles de l'interface utilisateur à partir d'un fil d'arrière-plan n'est pas sûre et entraînera des erreurs.
La solution :
Pour résoudre le problème de gel, employez un BackgroundWorker
dédié uniquement aux mises à jour de la barre de progression. Cela maintient le responsable des opérations de base de données séparé et évite les conflits.
Mise en œuvre du code :
MainWindow.xaml : Supprimez toute tentative de mise à jour directe de la barre de progression dans le BackgroundWorker
de l'opération de base de données.
Travailleur dédié à la barre de progression : Créez une nouvelle classe pour gérer les mises à jour de la barre de progression :
<code class="language-csharp">public class ProgressBarWorker { private ProgressBar progressBar; private BackgroundWorker worker; public ProgressBarWorker(ProgressBar progressBar) { this.progressBar = progressBar; worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += Work; worker.ProgressChanged += ProgressChanged; // Added ProgressChanged handler } public void Run() { worker.RunWorkerAsync(); } private void Work(object sender, DoWorkEventArgs e) { // Simulate long-running work; replace with your database operation for (int i = 0; i < 100; i++) { Thread.Sleep(100); // Simulate work worker.ReportProgress(i); // Report progress to the main thread } } private void ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; // Update progress bar on main thread } }</code>
Code MainWindow (Exemple) : Dans votre événement UserControl_Loaded
, initialisez et démarrez le ProgressBarWorker
:
<code class="language-csharp">ProgressBarWorker progressBarWorker = new ProgressBarWorker(progressBar); progressBarWorker.Run();</code>
Avantages :
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!