Новая форма в другой теме - PullRequest
       2

Новая форма в другой теме

7 голосов
/ 12 января 2011

Итак, в моем приложении есть поток, цель которого - прослушивать сообщения с сервера и действовать в соответствии с тем, что он получает.

Я столкнулся с проблемой, когда хотел отключить сообщение от сервера, что, когда клиентское приложение получит его, клиентское приложение откроет новую форму. Однако эта новая форма просто мгновенно зависает.

Я думаю, что происходит то, что новая форма загружается в том же потоке, что и нить, слушающая сервер, который, конечно, занят прослушиванием в потоке, в свою очередь блокируя нить.

Обычно для других моих функций в потоке прослушивания клиентов я использую вызовы для обновления пользовательского интерфейса основной формы, поэтому я предполагаю, что я спрашиваю, есть ли способ вызвать новую форму в основная форма.

Ответы [ 2 ]

16 голосов
/ 12 января 2011

Я предполагаю, что это Windows Forms, а не WPF?Из вашего фонового потока вы не должны пытаться создавать какие-либо формы, элементы управления и т. Д. Или манипулировать ими.Это будет работать только из основного потока, в котором работает цикл обработки сообщений, и может обрабатывать сообщения Windows.

Таким образом, чтобы ваш код выполнялся в основном потоке вместо фонового потока, вы можете использовать Control.BeginInvokeметод, подобный так:

private static Form MainForm; // set this to your main form

private void SomethingOnBackgroundThread() {

    string someData = "some data";

    MainForm.BeginInvoke((Action)delegate {

        var form = new MyForm();
        form.Text = someData;
        form.Show();

    });
}

Главное, что нужно иметь в виду, что если фоновый поток не нуждается в ответе от основного потока, вы должны использовать BeginInvoke, а не Invoke.В противном случае вы можете зайти в тупик, если основной поток занят в фоновом потоке.

0 голосов
/ 12 января 2011

Вы в основном дали ответ сами - просто выполните код для создания формы в потоке GUI, используя Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...