Это происходит потому, что вы выполняете всю обработку в Load event for the form. Это называется до, форма показана в первый раз.
В то время как в обработчике событий вы запрещаете отображение формы на самом деле, поскольку обработчик события должен завершиться, прежде чем что-либо еще будет обработано.
Что вы хотите сделать, это использовать экземпляр BackgroundWorker для выполнения вашей работы. Для этого необходимо выполнить следующие действия:
У вас есть некоторые проблемы здесь, поскольку у вас есть класс Pizza, который тесно связан с индикатором выполнения. Это не очень хорошая идея. Скорее, у вас должно быть событие, которое будет запущено, чтобы указать, что прогресс был изменен, а затем вызвать событие ProgressChanged из обработчика событий для вашего экземпляра Pizza.
Я переместил код для вашего метода Eat и инкапсулировал его в форму, чтобы показать вам пример использования класса BackgroundWorker, но идеальным решением было бы выставить событие, чтобы указать, когда количество пицца потребляет изменения.
Также обратите внимание, что вы должны переопределить protected Dispose method on the Form class, чтобы правильно утилизировать экземпляр BackgroundWorker, когда форма удалена.
Вот что пример выглядит следующим образом:
public void SpawnPizzaProgressBarForm(object sender, EventArgs e)
{
FormPizzaProgressBar Form = new FormPizzaProgressBar();
Form.ShowDialog();
}
...
BackgroundWorker worker = new BackgroundWorker();
public void ProgressBarForm_Load(object sender, EventArgs e)
{
// Initialize the background worker.
worker = new BackgroundWorker();
// Indicate that the worker supports progress.
worker.WorkerSupportsProgress = true;
// Subscribe to the DoWork event.
worker.DoWork += (s, e) => {
// Create the pizza instance.
Pizza = new Pizza();
// Process the slices.
foreach (var Slice in Pizza)
{
// Clear the slice.
Slice.Clear();
// Report the progress.
worker.ReportProgress(Slice.Index/Pizza.Count() * 100);
}
};
// Subscribe to the ProgressChanged event.
worker.ProgressChanged = (s, e) => {
// Update the progress bar.
PizzaEatingProgressBar.Value = e.ProgressPercentage;
};
// Subscribe to the RunWorkerCompleted event.
worker.RunWorkerCompleted = (s, e) => {
// Close the dislog.
this.Close();
};
}
// Must override to properly dispose of the background worker.
protected override void Dispose(bool disposing)
{
// Call the base.
base.Disposing(disposing);
// Dispose of the background worker if disposing is true.
if (disposing) worker.Dispose();
}
+1 для определения события, я не обращал на это внимания и только что принял проблемы с окраской с блокировкой потоков пользовательского интерфейса. –