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();
ce que vous essayez d'atteindre? – anishMarokey
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