К сожалению, звоню:
p.WaitForExit();
Заставит выполнение вашей программы блокироваться до тех пор, пока не будет запущен вызываемый исполняемый файл. Это не позволит WPF обработать свой обработчик сообщений, что, в свою очередь, помешает правильному обновлению индикатора выполнения.
Обычный способ справиться с этим - отключить элементы пользовательского интерфейса, а затем запустить процесс в фоновом потоке, показывая ваш прогресс. Когда процесс завершится, снова включите элементы пользовательского интерфейса. Используя .NET 4, это может быть что-то вроде:
// 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());
В качестве альтернативы, вы можете сделать то же самое через 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();