Это происходит потому, что вы выполняете всю обработку в событии загрузки для формы .Это называется до , когда форма показывается впервые.
Находясь в обработчике событий, вы запрещаете отображение формы, так как обработчик событий должен завершиться раньше всего.может быть обработан.
То, что вы хотите сделать, это использовать экземпляр BackgroundWorker для выполнения вашей работы.Для этого необходимо сделать следующее:
У вас есть некоторые проблемы, связанные с тем, что класс Pizza тесно связан с индикатором выполнения.Это не очень хорошая идея.Скорее, у вас должно быть событие, которое вызывается, чтобы показать, что прогресс изменился, а затем вызвать событие ProgressChanged из обработчика событий для вашего экземпляра Pizza.
Я удалил код для вашего метода Eatи заключил его в форму, чтобы показать вам пример использования класса BackgroundWorker, но идеальным решением было бы выставить событие, чтобы указать, когда количество потребляемой пиццы изменяется.
Также обратите внимание, что вам следуетпереопределите защищенный метод Dispose в классе Form для правильного удаления экземпляра 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();
}