Учебник по .NET для работы с потоками через интерфейс WPF - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь построить простой сетевой чат в c #, используя WPF в качестве графического интерфейса. Поскольку я хочу включить чат без сервера, я бы хотел, чтобы каждый экземпляр приложения прослушивал IP-адреса для многоадресных сообщений и также отправлял многоадресные рассылки на этот IP-адрес. Тем не менее, все различные учебные пособия для многопоточных сетей, которые я нахожу в сети, используют консоль, а не WPF, которая установлена ​​в своем собственном потоке. Я пытался адаптировать эти учебные пособия, но всегда что-то не получалось, например, приостановка потока GUI или сообщения, которые не обрабатываются / не добавляются в GUI. Учебники о системах потоков для потребителей / производителей также были бы хорошими.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Это может быть не самый простой пример, но это игра WPF с несколькими AI, соединенными через сокет https://github.com/bondehagen/CloudWars

Я использую DispatcherTimer Class , чтобы поддерживать вращение графического интерфейса, а затем проверять очередь на поступающие команды для управления игроками. Этот класс может быть полезен https://github.com/bondehagen/CloudWars/blob/master/Simulator/CloudWars.Gui/Helpers/WindowThread.cs

1 голос
/ 06 марта 2012

Ничто не отличается между вашим сценарием и любым другим сценарием с межпоточным взаимодействием, за исключением того, что у вас есть много бесплатной работы, которую вы можете использовать, поскольку вы выполняете маршалинг между WPF и каким-либо другим потоком.

Короткая версия: Когда вы получаете сообщение от другого клиента в вашем локальном стеке и вам нужно сообщить WPF, используйте Dispatcher.Invoke из сетевого потока, чтобы маршалировать вызов потока WPF, предположительно передавая ему какой-то объект Message. Это очень просто с лямбдами:

Сначала сохраните ссылку на диспетчер WPF в фоновом потоке во время инициализации приложения. Это легко, потому что (если вы не патологически многопоточны) ваш поток WPF является тем, который раскручивает ваш сетевой поток:

var guiDispatcher = Dispatcher.CurrentDispatcher;

Как только ваш другой поток сможет получить доступ к диспетчеру графического интерфейса, он может асинхронно запускать код в контексте этого диспетчера (в нашем случае, в потоке графического интерфейса WPF):

Message msg = myNetworkComms.GetMessage(); // or whatever
Action updateGui = () => myViewModel.ApplyNewMessage(msg);
guiDispatcher.BeginInvoke(DispatcherPriority.Normal, updateGui); // Run updateGui on GUI thread

Все это говорит, почему вы раскручиваете отдельный поток для своего сетевого ввода-вывода? Это кажется ужасно расточительным. Вы уверены, что нет никаких методов асинхронного сетевого ввода-вывода, которыми вы могли бы воспользоваться?

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