Как создать новую форму окна и связать ее с уже существующим потоком? - PullRequest
2 голосов
/ 17 декабря 2008

Я пытаюсь написать чат-клиент на C # и столкнулся с проблемой.

Как это работает, клиент опрашивает сервер каждую 1 секунду, чтобы узнать, есть ли какие-либо новые действия, которые нужно предпринять (например, отобразить сообщение в канале или что-то еще). Опрос выполняется в отдельной ветке.

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

Итак, в основном я спрашиваю, как мне создать новую форму окна и связать ее с уже существующим потоком? (вместо темы, которая его создала).

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

Спасибо всем

Ответы [ 2 ]

4 голосов
/ 17 декабря 2008

Заставьте поток опроса вернуться к главной форме, используя Control.Invoke или Control.BeginInvoke , и создайте форму в обратном вызове.

Я предполагаю, что вы уже используете Invoke / BeginInvoke для обновления пользовательского интерфейса - это просто еще один вид пользовательского интерфейса.

0 голосов
/ 17 декабря 2008

Вы должны вызвать функцию из главного окна:

    void MyWorkerThread() {
        while (Connected) {
            Thread.Sleep(1000);
            if (NewMessage) {
                ShowNewForm();
            }
        }
    }

    void ShowNewForm() {
        if (this.InvokeRequired) { // this refers to the current form
            this.Invoke(new Action(ShowNewForm));  // this line invokes the same function on the same thread as the current form
            return;
        }
        Form myMdiForm = new Form();
        myMdiForm.Show();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...