Я создаю приложение, в котором он запускает форму FormSelect(), предлагая пользователю выбрать элемент в списке, когда пользователь нажимает кнопку «Выбрать», он создаст новый экземпляр MainForm (), скрыть FormSelect и показать MainForm, но он не работает, я получаю исключение со всеми тестами, которые я сделал.Form Show не работает с потоками
Вот некоторые коды:
static class Program {
public static MainForm mainForm;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormSelect());
}
}
Ничего особенного в моем FormSelect, так вот кнопка мыши, где она начала MainForm:
private async void btnSelect_Click(object sender, EventArgs e) {
loadingSpiner.Visible = true;
btnSelect.Enabled = false;
int index = listProcess.SelectedIndex;
await startMainForm(index);
this.Hide();
Program.mainForm.Show();
}
private async Task startMainForm(int index) {
await Task.Run(() => {
Program.mainForm = new MainForm(runningProcess[index]);
});
}
Как вы можете видеть выше, я используя Task для запуска MainForm, чтобы он не замораживал мой пользовательский интерфейс и мой «загрузочный лоток»
Но когда он пытается использовать .Show(), я получаю исключение перекрестной резьбы, поэтому я попытался вызвать этот actio п с помощью:
this.Invoke(new MethodInvoker(delegate() { Program.mainForm.Show(); }));
Но с помощью метода выше, я получаю исключение, говоря:
исключение типа «System.ComponentModel.Win32Exception» произошло в System.Windows.Forms.dll, но не обрабатывается код пользователя
Дополнительная информация: Ошибка при создании дескриптора окна.
Если я удалю «Ожидание Task.Run() ...» в методе startMainForm, все работает нормально, но полностью блокирует интерфейс FormSelect.
Как я могу избежать этой проблемы? Спасибо!
вы не должны открывать какие-либо ui с uithread. –
Вы не можете создавать пользовательский интерфейс в любом потоке, отличном от потока, используемого для вызова 'Application.Run' - чаще всего называемого потоком пользовательского интерфейса. – Enigmativity
Я думаю, что форма «по умолчанию», которая запускается при запуске приложения, указана в Program.cs. В Program.cs вы должны найти вызов для запуска этой формы, которая должна блокироваться (поскольку в этот момент мы однопоточно), и после этого добавьте код, чтобы начать следующую форму? – XtrmJosh