【问题标题】:How can I implement Network and Serial communication components in my WPF application?如何在我的 WPF 应用程序中实现网络和串行通信组件?
【发布时间】:2013-04-30 06:04:47
【问题描述】:

我正在寻找关于这个问题的技术性更低、概念性更强的答案。

我希望使用 .NET 4.5 构建一个 WPF 应用程序来控制流动站(美化 RC Car)。这是预期的功能:

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

我不确定要使用哪种技术来实现这一点,但根据我的研究,BackgroundWorkers 或 Threads 和异步技术将是值得研究的事情。哪一条看起来像是一条好路?另外,我应该直接在应用程序中使用 TCP 套接字还是应该/可以使用 WCF 来提供这些数据?

在这方面的任何智慧都会很棒。提前致谢。

编辑:

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

  • 一切都围绕着使用 MVVM 模式进行。
    • 控制面板和网络组件都有视图,每个视图都有一个对应的视图模型来处理后台操作。
  • 更新 UI 是通过 databinding 而不是 Dispatcher 完成的。
  • 无线通信通过TCPListener异步(async/await)完成的,同时使用了Tasks
  • 串口通信通过SerialPortTasks异步完成的。
  • 使用ModernUI 作为接口。
  • 使用 JSON.NET 进行 JSON 解析。

Here is a link to the project。它是在一个月的时间内完成的,所以它不是最漂亮的代码。今年夏天我已经改进了很多实践,所以我很高兴能在明年完成的重构版本上工作。

【问题讨论】:

  • 您自己在为漫游车编程吗?在那种情况下,使用了哪些技术?
  • 不,其他程序员正在这样做,但本质上,流动站端是与 Python 一起使用的树莓派。树莓派从流动站上的微控制器接收到的信号通过 TCP 通过无线发送到 GUI。

标签: c# wpf multithreading sockets asynchronous


【解决方案1】:

当您使用 .NET 4.5 时,您不需要为您的项目使用线程和后台工作程序。你不需要照顾你所有的线程。因为 WPF 的Dispatcher 是一个非常强大的工具,用于处理来自其他线程的 UI。

  • 对于 TCP 通信,我建议您将 TCP ClientTCP Listner 与异步回调一起使用。并使用 Dispatcher 更新您的 UI。
  • 要通过 RTSP 显示摄像机,请使用 VLC.Net 一个适用于处理许多实时视频协议的 VLC 库的开源包装器。
  • 使用任务而不是线程,根据您的要求设置它们的优先级。

您的应用程序不需要 WCF。

【讨论】:

    【解决方案2】:

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

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

    我曾尝试(一次)用我自己的独立线程来处理我的所有 I/O 和与我的主线程的内部管道连接来告诉它正在发生的事情。我做到了,但这真的非常非常辛苦。例如,我发现在超时之前取消阻塞网络或管道 I/O 操作是不可能的(任何更熟悉 Win32 和 .NET 的人的想法?)。我只是想这样做,因为在 Windows 中没有真正的 select() 等价物。 is 的那个除了套接字之外不能使用任何东西......如果有人想知道'为什么为什么哦为什么?',我正在重新实现一个最初为 Unix 编写的应用程序和天真地不想改变架构。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多