如何在我的WPF应用程序中实现网络和串行通信组件



我希望这个问题的答案不那么技术性,更概念化。

我希望使用。net 4.5构建一个WPF应用程序来控制漫游者,(光荣的RC车)。下面是预期的功能:

  • 应用程序和漫游车将通过TCP Socket发送和接收字符串JSON进行无线通信。
  • GUI将通过RTSP显示多个视频馈送。
  • 控制面板-自定义硬件-将通过USB连接到计算机,这些信号将被转换为JSON,然后通过TCP连接发送并提供移动指令。
  • GUI将需要更新以反映控制面板的状态以及基于接收到的数据的漫游者的状态。

我不确定使用哪种技术来实现这一点,但从我的研究来看,后台工作者或线程和异步技术将是值得研究的东西。下面哪条路比较好呢?另外,我应该在应用程序中直接使用TCP套接字,还是应该/可以使用WCF来提供这些数据?

在这方面的任何智慧都将是伟大的。提前谢谢。 编辑:

这是使用的最终实现,男孩做得很好:

  • 使用MVVM模式,一切都到位了。
    • 有用于控制面板和网络组件的视图,每个视图都有相应的ViewModel来处理后台操作。
  • UI的更新是通过databinding完成的,而不是Dispatcher。
  • 无线通信通过TCPListener异步(async/await)完成,同时使用Tasks
  • 串口通信通过SerialPort和Tasks异步完成
  • 使用modnui作为接口
  • 使用JSON。

这是项目的链接。它是在一个月的过程中完成的,所以它不是最漂亮的代码。今年夏天我对自己的实践做了很多改进,所以我很高兴能在明年完成一个重构的版本。

因为你使用的是。net 4.5,所以你不需要为你的项目使用线程和后台工作器。你不需要处理所有的线程。因为WPF的Dispatcher是一个非常强大的工具,可以处理来自其他线程的UI。

  • 对于TCP通信,我建议您使用TCP客户端和TCP侦听器与异步回调。并使用Dispatcher更新你的UI。
  • 通过RTSP显示相机,使用VLC。. Net是VLC库的一个开源包装器,可以处理许多实时视频协议。
  • 使用任务代替线程,根据你的需要设置它们的优先级。

你的应用程序不需要WCF

据我所知(我不是专家),MS现在的理念是使用异步I/O,线程池任务来执行冗长的计算操作,并为应用程序的主要部分使用单个主线程执行。该主线程驱动GUI,并在需要时委托异步I/O和线程池任务。

因此,对于您的应用程序,这意味着异步接收消息,并在线程池上启动一个任务来处理消息,最后在任务完成时在GUI上显示结果。它最终看起来像一个单线程事件循环应用程序。异步I/O和线程池任务实际上使用线程,只是它们以一种尽可能方便的方式对你隐藏起来。

我曾经尝试过(一次)用我自己的独立线程处理我所有的I/O和一个内部管道连接到我的主线程来告诉它发生了什么。我成功了,但那真的非常非常辛苦。例如,我发现在超时之前取消阻塞的网络或管道I/O操作是不可能的(有更熟悉Win32和。net的人有什么想法吗?)我只是想这样做,因为在Windows中没有真正的等同select();在那里不工作,除了套接字…如果有人想知道"为什么为什么哦为什么?"’,我正在重新实现一个最初为Unix编写的应用程序,并且天真地不想改变其体系结构。

下次(如果有的话)我会坚持微软的方法。

= = = =

编辑

从那时起,我将WPF和ZeroMQ集成在一起。基本上,它意味着有两个并行的事件循环——WPF与处理ZerMQ轮询的线程一起运行。后者使BeginInvoke()回调到WPF事件循环以在GUI上完成任务。这并不像WPF的事件循环那样直接处理ZeroMQ套接字(等效的可以在*nix上的其他gui中完成,可以将套接字/文件描述符作为事件源),但它可以做到。

最新更新