一个使用WPF前端的线程网络的.NET教程

本文关键字:前端 线程 网络 教程 NET WPF 一个 | 更新日期: 2023-09-27 18:27:02

我正在尝试使用WPF作为GUI在c#中构建一个简单的LAN聊天。由于我想启用无服务器聊天,我希望应用程序的每个实例都能在一个IP上侦听多播消息,并向该IP发送多播消息。然而,我在网上找到的所有关于线程网络的各种教程都使用控制台,而不是WPF,它是在自己的线程中设置的。我尝试过调整这些教程,但总有一些失败的地方,比如GUI线程挂起,或者消息没有被处理/添加到GUI中。关于使用者/生产者线程系统的教程也会很棒。

一个使用WPF前端的线程网络的.NET教程

您的场景和任何其他具有线程间通信的场景之间没有什么不同,只是您有很多空闲工作可以利用您在WPF和其他线程之间编组的b/c。

简短版本:当您从本地堆栈中的另一个客户端接收到消息,并且需要通知WPF时,请使用Dispatcher.Invoke从网络线程封送对WPF线程的调用,可能会向它传递某种message对象。这对lambdas:来说格外容易

首先,在应用程序初始化期间,在后台线程上存储对WPF调度器的引用。这很容易,因为(假设你不是病态的多线程)你的WPF线程就是那个让你的网络线程旋转的线程:

var guiDispatcher = Dispatcher.CurrentDispatcher;

一旦您的另一个线程能够访问gui调度器,它就可以在该调度器的上下文(在我们的例子中,是WPF gui线程)上异步运行代码:

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

尽管如此,为什么要为网络I/O设置一个单独的线程?这似乎非常浪费资源。你确定没有任何异步网络I/O方法可以利用吗

这可能不是最简单的例子,但它是一个WPF游戏,有多个AI通过套接字连接https://github.com/bondehagen/CloudWars

我使用DispatcherTimer类来保持GUI的旋转,然后检查队列中的传入命令以控制玩家。这个类可能有用https://github.com/bondehagen/CloudWars/blob/master/Simulator/CloudWars.Gui/Helpers/WindowThread.cs