2010-10-11 4 views
2

J'essaye d'exécuter un Process.Start() qui est un processus de longue durée, et montre une barre de progression circulaire sur l'écran pendant l'exécution du processus.Thread WPF pour la surveillance Process.Start et affichage de la barre de progression

J'ai les lignes de code suivantes:

Process p = 
    Process.Start(longRunningProcess); 

    // show the circular progress bar; 

    ShowHideCirProgBar(true); 

    // wait till the process ends execution 

    p.WaitForExit(); 

    // hide the circular progress bar 

    ShowHideCirProgBar(false); 

Je suis nouveau au modèle de filetage et ne savez pas comment mettre en œuvre pour que ce qui précède. Toute aide est la bienvenue.

Merci, PJ

+0

ce que vous essayez d'atteindre? – anishMarokey

+0

Donc, vous voulez l'indicateur de progression, mais sans bloquer le fil de l'interface utilisateur? Êtes-vous d'accord avec l'utilisateur qui fait quelque chose avant la fin du processus externe? – kmfk

Répondre

2

Malheureusement, appeler:

p.WaitForExit(); 

PROVOQUERONT l'exécution de votre programme pour bloquer jusqu'à ce que les sorties exécutables donné naissance. Cela empêchera WPF de traiter sa pompe de message, ce qui empêchera votre barre de progression de se mettre correctement à jour.

La façon normale de gérer cela est de désactiver vos éléments d'interface utilisateur, puis de générer le processus dans un thread d'arrière-plan, en indiquant votre progression. Lorsque le processus est terminé, réactivez les éléments de l'interface utilisateur. En utilisant .NET 4, cela pourrait être quelque chose comme:

// Add code to disable UI, if required 
DisableUI(); 

// Show the circular progress bar; 
ShowHideCirProgBar(true); 

// Wait till the process ends execution in a background thread 
var task = Task.Factory.StartNew(() =>  
    { 
     Process p = Process.Start(longRunningProcess); 
     p.WaitForExit(); 
    }); 

// Reenable the UI when the process completes... 
task.ContinueWith(t => 
    { 
     EnableUI(); 

     // hide the circular progress bar 
     ShowHideCirProgBar(false); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 

Sinon, vous pouvez faire la même chose via un BackgroundWorker:

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += (s, e) => 
    { 
     Process p = Process.Start(longRunningProcess); 
     p.WaitForExit(); 
    }; 
bw.RunWorkerCompleted += (s, e) => 
    { 
     EnableUI(); 

     // hide the circular progress bar 
     ShowHideCirProgBar(false); 
    }; 

// Add code to disable UI, if required 
DisableUI(); 

// Show the circular progress bar; 
ShowHideCirProgBar(true); 
bw.RunWorkerAsync(); 
+0

Merci beaucoup Saurabh et Reed. Laisse-moi essayer tout de suite. Je vais écrire avec le résultat bientôt. –

+0

Salut Reed: Cela a fonctionné exactement comme je le voulais. Merci beaucoup. J'apprécie vraiment beaucoup votre aide. –

2

je pense, vous devriez donner un essai à Background worker

Et je pense que, vous voulez acheive une interface utilisateur resposive pendant que votre tâche d'arrière-plan est en cours d'exécution. Si c'est le caxe, vous pouvez utiliser la classe ouvrier d'arrière-plan, je pense que cette classe est la classe la plus basique qui fonctionne magnifiquement et moins compliquée à comprendre si vous êtes un débutant de concepts de threading.

Cette classe expose les événements auxquels vous pouvez vous abonner pour gérer le scénario long.

class ThreadingWithBg 
{ 
    BackgroundWorker bg = null; 


    public ThreadingWithBg() 
    { 
     bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted); 

    } 

    void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 


    } 

    void bg_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      Console.WriteLine(i.ToString()); 

     } 
    } 

    public void DoLongWork() 
    { 
     bg.RunWorkerAsync(); 

    } 
} 
+0

Non, je ne veux pas que l'utilisateur fasse quoi que ce soit pendant que l'exécution se poursuit. C'est pourquoi je désactive également l'écran lorsque la barre de progression circulaire apparaît. Vous pouvez clairement voir avec mon code, il montre mais ne tourne pas. –

+0

Saurabh: Pouvez-vous s'il vous plaît me fournir des extraits de code pour mon cas spécifique? –

+0

Sure attendre un certain temps, je vais poster – TalentTuner

Questions connexes