Я пытаюсь написать клиент чата на C# и столкнулся с проблемой.
Принцип работы заключается в том, что клиент опрашивает сервер каждую секунду, чтобы узнать, нужно ли предпринять какие-либо новые действия (например, отобразить сообщение в канале или что-то еще). Опрос выполняется в собственном потоке.
Теперь я хочу, чтобы поток опроса открывал новую форму MDI при получении действия открытия канала (что означает, что пользователь вошел в новый канал). Дело в том, что новая форма должна выполняться в ОСНОВНОМ программном потоке, а не в рабочем потоке.
Итак, в основном я спрашиваю, как мне создать новую форму окна и связать ее с уже существующим потоком? (вместо потока, который его создал).
Кроме того, если вы знаете, как это сделать лучше, сообщите мне, пожалуйста. Мне нравится улучшать архитектуру моей программы!
Спасибо всем





Сделайте вызов потока опроса обратно в основную форму, используя 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();
}
Сторменет: Спасибо за подробный ответ. К сожалению, я не уверен, как связать это с моим кодом, поскольку созданный мной рабочий поток не открывает никаких форм, он просто выполняет некоторую работу. Поэтому, когда вы выполняете this.InvokeRequired в ShowNewForm (), у меня нет метода InvokeRequired, поскольку эти методы не находятся в классе формы. Надеюсь, в этом есть смысл, возможно, я не объясняю себя должным образом.
У рабочего потока должна быть ссылка на форму, и он может таким образом вызывать метод.
Я не думаю, что действительно есть необходимость делать саму ShowNewForm поточно-ориентированной - просто вызовите Invoke (или BeginInvoke) из метода рабочего потока. Это упрощает код, ИМО.