Как мне создать новую форму окна и связать ее с уже существующим потоком?

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

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

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

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

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

Спасибо всем

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
650
2

Ответы 2

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

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

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

    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();
    }

Я не думаю, что действительно есть необходимость делать саму ShowNewForm поточно-ориентированной - просто вызовите Invoke (или BeginInvoke) из метода рабочего потока. Это упрощает код, ИМО.

Jon Skeet 17.12.2008 16:50

Сторменет: Спасибо за подробный ответ. К сожалению, я не уверен, как связать это с моим кодом, поскольку созданный мной рабочий поток не открывает никаких форм, он просто выполняет некоторую работу. Поэтому, когда вы выполняете this.InvokeRequired в ShowNewForm (), у меня нет метода InvokeRequired, поскольку эти методы не находятся в классе формы. Надеюсь, в этом есть смысл, возможно, я не объясняю себя должным образом.

EdanB 17.12.2008 17:00

У рабочего потока должна быть ссылка на форму, и он может таким образом вызывать метод.

Jon Skeet 17.12.2008 17:01

Другие вопросы по теме