У меня возникли проблемы с концепцией потоков и их использованием.Как создать новую форму WPF из другого потока в C#
Я пытаюсь кодировать довольно основную программу чата (как часть более крупной программы), и в настоящее время он работает так:
класс «NetworkSession» получает входные данные от сервера в отдельном потоке в петля. Если он получает ввод, который указывает, что он должен открыть новое окно чата, он создает новый класс WPF (ChatWindow) и отображает его.
Первоначально я получил сообщение об ошибке, что «вызывающий поток должен быть STA, потому что для этого требуется множество компонентов пользовательского интерфейса». Поэтому я установил поток в STA, но теперь, конечно, форма WPF непригодна для использования, поскольку работает в том же потоке, что и цикл блокировки.
Итак, мой вопрос заключается в том, как создать новый экземпляр формы WPF из другого потока.
Я видел много дискуссий об этом, но он имеет тенденцию иметь дело с запуском делегата из уже построенной формы.
Вот несколько кодов.
while (Connected) //this loop is running on its own thread
{
Resp = srReceiver.ReadLine();
if (Resp.StartsWith("PING")) SendToServer("PONG");
if (Resp.StartsWith("CHAT FROM"))
{
String[] split = Resp.Split(' ');
Console.WriteLine("Incoming Chat from {0}", split[2]);
bool found = false;
if (Chats.Count != 0)
{
foreach (ChatWindow cw in Chats)
{
if (cw.User == split[2])
{
found = true;
cw.AddLine(cw.User, split[3]); // a function that adds a line to the current chat
}
}
}
if (!found)
{
ChatWindow temp = new ChatWindow(split[2], split[3]);
Chats.Add(temp); //this is a collection with T = ChatWindow
temp.Show();
}
}
}