С# вызов формы .show() из другого потока - программирование

С# вызов формы .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
}
4b9b3361

Ответ 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 может помочь.