Ваш оригинальный код не имеет смысла. Он показывает форму, затем запускает поток, а затем ожидает завершения этого потока. Если вы хотите, чтобы форма запускалась в собственном потоке пользовательского интерфейса, ProcessInkPresenter
запустите в том же потоке пользовательского интерфейса (что следует делать, если он взаимодействует с пользовательским интерфейсом) и закройте форму и удалите ее после завершения ProcessInkPresenter
, попробуйте это:
private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
Thread thread = new Thread(state => {
using (var waitForm = new WaitForm()) {
waitForm.Activated += (s, e) => {
ProcessInkPresenter();
waitForm.Hide();
}
Application.Run(waitForm);
}
}
);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Если рабочий поток не должен взаимодействовать с графическим интерфейсом, то вам нужно что-то вроде следующего. Обратите внимание, что я использую Invoke, чтобы убедиться, что взаимодействие с пользовательским интерфейсом выполняется в потоке пользовательского интерфейса . Здесь нет необходимости проверять InvokeRequired, поскольку я уже точно знаю, что я нахожусь в фоновом потоке.
Если вы хотите сохранить тот же экземпляр waitForm:
private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
Thread thread = new Thread(state => {
try {
ProcessInkPresenter();
// If ProcessInkPresenter fails, this line will never execute
waitForm.Invoke(new Action(()=>waitForm.Hide()));
}
catch (Exception ex) {
// You probably want to do something with ex here,
// rather than just swallowing it.
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
waitForm.Show();
}
ПРИМЕЧАНИЕ: Не имеет смысла утилизировать ваш WaitForm, если у вас есть один его экземпляр (ваш Wait
экземпляр). Либо создайте экземпляр каждый раз, когда вы его используете, либо никогда не удаляйте его и используйте вместо него .Hide()
.