2017-10-15 7 views
1

Je travaille avec C# il y a seulement un an et demi, j'apprends. J'ai un programme qui m'aide dans mon travail, Il communique avec 4 types de bases de données sur mon lieu de travail. Cela fonctionne parfaitement, mais maintenant je veux concevoir pour le rendre beaucoup plus cool, mais je suis resté bloqué quand j'ai voulu configurer un anneau de progression, parce que mes méthodes gèlent l'interface utilisateur pendant qu'elles communiquent avec mes bases de données. Je veux configurer un travailleur de fond, j'ai essayé tout ce que j'ai trouvé, même invoquer aussi, mais rien ne l'a fait fonctionner.Comment permettre à l'arrière-planaire de mettre à jour l'interface utilisateur et de définir (métro) la progression pour cela?

public partial class MainWindow : MetroWindow 
{ 
    BackgroundWorker workerThread = null; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InstantiateWorkerThread(); 

     progressrinG.IsActive = true; 
    } 
    private void InstantiateWorkerThread() 
    { 
     workerThread = new BackgroundWorker(); 
     workerThread.ProgressChanged += WorkerThread_ProgressChanged; 
     workerThread.DoWork += WorkerThread_DoWork; 
     workerThread.RunWorkerCompleted += WorkerThread_RunWorkerCompleted; 
     workerThread.WorkerReportsProgress = true; 
     //workerThread.WorkerSupportsCancellation = true; 
    } 

    private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

    } 
    private void WorkerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 
    private void WorkerThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //My huge method,asking 4 database that would update UI too 
     //... Textboxes,Grids,Expanders. 
    } 

    private void Button3_Click(object sender, RoutedEventArgs e) 
    { 
     workerThread.RunWorkerAsync(); 

     while (workerThread.IsBusy) 
     { 
      progressrinG.Visibility = Visibility.Visible; 
     } 
    } 
} 

Même avec Invoke, quand j'appuie sur le bouton, après 5-10 secondes, il termine ma méthode, mais mon application est gelé tout en le faisant et je ne vois pas le progressring.

Des idées sur ce que je fais mal? Ou que devrais-je faire? Merci d'avance!

Répondre

1

Ne mettez pas à jour l'interface utilisateur à partir d'un thread de travail au WorkerThread_DoWork, mais au moyen du fil d'interface utilisateur WorkerThread_ProgressChanged.

Appelez régulièrement worker.ReportProgress à partir de votre travailleur en passant un pourcentage de progression arbitraire de sorte que WorkerThread_ProgressChanged soit appelée. Mettez à jour l'interface utilisateur uniquement lorsque la différence en pourcentage a été modifiée pour empêcher l'épuisement de la mise à jour de l'interface utilisateur.

+0

J'essaie de trouver un exemple maintenant comment le faire, puis je vais essayer d'éditer ma méthode. Je vous remercie. Upvoted. – Tamas555

0

Désolé si vous avez déjà trouvé un exemple, mais j'ai récemment fait moi-même. C'est légèrement différent mais peut être adapté à ce dont vous avez besoin. J'ai un spinner que je lance à partir d'un clic de bouton qui exécute également mes méthodes, j'ai alors un label que je mets à jour en utilisant ReportProgress comme suggéré par MickyD. Je passe à travers une boucle que je signale chaque fois que je recommence en haut de la boucle. J'appelle ProgressChanged comme ceci

backgroundWorker.ReportProgress((100 * i)/rowCount); 

Nombre de lignes est le nombre total de fois que je veux faire le tour de la boucle.

Espérons que cela a du sens?