1

我正在寻找关于这个问题的更少技术性和更多概念性的答案。

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

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

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

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

编辑:

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

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

这是该项目的链接。它是在一个月的时间内完成的,所以它不是最漂亮的代码。今年夏天我已经改进了很多实践,所以我很高兴能在明年完成的重构版本上工作。

4

2 回答 2

3

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

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

您的应用程序不需要 WCF。

于 2013-04-30T16:19:09.243 回答
2

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

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

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

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

于 2013-04-30T07:17:50.633 回答