Лучший способ выполнить код после события из другого класса происходит в С#

Скажем, у нас есть form A которой есть кнопка "Запустить мастера". Нажатие этой кнопки открывает мастер для создания чего-то. Этот мастер импортируется из другого проекта, который формирует ссылки A. Мастер во время своей работы создает несколько массивов.

Это код от нажатия кнопки:

private void buttonOpenWizard_Click(object sender, EventArgs e)
 {
 SampleWizard wizard = new SampleWizard();
 wizard.Show();
 //(theoretical code using arrays created by the wizard)
 }

Каков наилучший способ дождаться завершения работы мастера и запустить теоретический код только после выполнения задачи мастера?

2 ответа

Поскольку вы, похоже, не против блокировки, используйте ShowDialog:

private void buttonOpenWizard_Click( object sender, EventArgs e )
{
 SampleWizard wizard = new SampleWizard();
 if( wizard.ShowDialog() == DialogResult.OK ) // this line will block until the wizard form is closed
 {
 // and any code here will not run until that has happened
 }
}

Обычно вы используете возвращаемое значение из вызова ShowDialog чтобы указать, завершил ли пользователь мастер/диалог или нет. В этом случае мне не удастся узнать, использует ли эта форма это или нет, но здесь я предполагал, что это так.

Если вы не хотите блокировать, вы должны сделать что-то вроде этого:

private void buttonOpenWizard_Click( object sender, EventArgs e )
{
 SampleWizard wizard = new SampleWizard();
 wizard.FormClosed += WizardClosed; // hook up event handler
 wizard.Show();
}

private void WizardClosed( object sender, FormClosedEventArgs e )
{
 var wizard = (SampleWizard)sender;
 // check and use result of wizard here
}


private void buttonOpenWizard_Click(object sender, EventArgs e)
 {
 SampleWizard wizard = new SampleWizard();
 if(wizard.ShowDialog()== DialogResult.OK) //Set the dialog result to ok in your form, if it would closed corret
 {
 //(theoretical code using arrays created by the wizard)
 }

 }

licensed under cc by-sa 3.0 with attribution.