С# вызов формы .show() из другого потока
если я вызываю form.show()
в объект WinForms из другого потока, форма выдает исключение. Является ли какой-либо способ добавить новую, видимую форму в основной поток приложений? В противном случае, как я могу открыть форму без остановки текущего исполняемого потока?
Вот мой пример кода. Я пытаюсь запустить поток, а затем выполнить некоторую работу внутри этого потока. По мере продвижения работы я покажу форму.
public void Main()
{
new Thread(new ThreadStart(showForm)).Start();
// Rest of main thread goes here...
}
public void showForm()
{
// Do some work here.
myForm form = new myForm();
form.Text = "my text";
form.Show();
// Do some more work here
}
Ответы
Ответ 1
Попробуйте использовать вызов вызова:
public static Form globalForm;
void Main()
{
globalForm = new Form();
globalForm.Show();
globalForm.Hide();
// Spawn threads here
}
void ThreadProc()
{
myForm form = new myForm();
globalForm.Invoke((MethodInvoker)delegate() {
form.Text = "my text";
form.Show();
});
}
В вызове "invoke" отображается форма "Пожалуйста, выполните этот код в своем потоке, а не в моем". Затем вы можете внести изменения в пользовательский интерфейс WinForms из делегата.
Дополнительная информация о Invoke приведена здесь: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
EDIT: вам нужно будет использовать объект WinForms, который уже существует для вызова invoke. Я показал здесь, как вы можете создать глобальный объект; в противном случае, если у вас есть другие объекты Windows, они также будут работать.
Ответ 2
Вам следует позвонить Application.Run()
после вызова form.Show()
. Например:
public void showForm()
{
// Do some work here.
myForm form = new myForm();
form.Text = "my text";
form.Show();
Application.Run();
// Do some more work here
}
Что касается деталей, почему, этот пост msdn может помочь.