我有一块硬件通过 PCI 总线连接到我的 PC。我正在通过设备驱动程序周围的 .NET 包装器访问硬件。
我没有关于设备如何执行 PCI 的任何规范。这让我想到了我的第一个问题。
1)通过PCI连接的设备是否保证以一定的速度传输数据?
2) 与设备通信时,我希望我的 UI 保持响应。在(线程池)线程中启动与设备的通信是个好主意,或者与访问 PCI 总线的速度相比,与此相关的开销是否太大?
编辑:
问题重写。过多地反映了漫长工作日的结束。
删除了线程是线程池线程的要求。
我有一块硬件通过 PCI 总线连接到我的 PC。我正在通过设备驱动程序周围的 .NET 包装器访问硬件。
我没有关于设备如何执行 PCI 的任何规范。这让我想到了我的第一个问题。
1)通过PCI连接的设备是否保证以一定的速度传输数据?
2) 与设备通信时,我希望我的 UI 保持响应。在(线程池)线程中启动与设备的通信是个好主意,或者与访问 PCI 总线的速度相比,与此相关的开销是否太大?
编辑:
问题重写。过多地反映了漫长工作日的结束。
删除了线程是线程池线程的要求。
一般来说,只要有机会编写没有线程关联的代码,这样做通常是个好主意。这样一来,当它成为响应性问题时,您可以自由关闭 UI 线程。使用异步方法为此 I/O 设计您的 API 还可以让您的选项以一种良好的方式向前发展。
如果您不必长时间占用它,您所在的线程是线程池线程还是您自己生成的线程似乎无关紧要。如果你可以做异步 I/O,那么线程池线程应该没问题。
通过 PCI 连接的设备是否可以保证以一定的速度传输数据?
不。据我了解,PCI是一种具有总线主控功能的共享总线,该功能允许单个设备临时利用全部总线带宽。在非服务器环境中,这通常意味着 133MB/s 的带宽。一旦 PCI 总线上有几个 I/O 卡,您就可以看到带宽在负载下可能变得稀缺。行为不端的设备也会对延迟产生不利影响;一些控制器挂起,直到其驱动器响应 I/O,但允许,这是一种异常情况。
与设备通信时,我希望我的 UI 保持响应。在(线程池)线程中启动与设备的通信是个好主意,或者与访问 PCI 总线的速度相比,与此相关的开销是否太大?
在编写面向用户的软件时,将 UI 与 I/O 或其他可能长时间运行的进程分开总是一个好主意。例如,现代 Android SDK 在其 HTTP 客户端中强制执行此操作 - 如果在 UI 线程上执行 HTTP 请求,它会引发异常。
根据您所针对的 .NET 框架的版本,您可以使用多种选项将设备通信与 UI 分开。查看.NET Framework 中的并行处理和并发,以获得各种选项的高级概述。线程是低级抽象,您可能会发现使用更高级别的抽象(例如Tasks或 C# 的async 和 await 关键字)更容易且不易出错。
我认为当您需要监控硬件状态时,使用长时间运行的后台线程是有意义的。TaskCreationOptions.LongRunning看起来很合适。
此外,使用 C# 的新 async/await 功能与设备异步交互对我来说很有意义。我不确定它是否会有所帮助,但这里有一个片段来说明我通常如何处理硬件交互(对我来说通常是 WinUSB 设备):
class Controller : IDisposable // to dispose the unmanaged resources related to the hardware
{
// this will be used to call back to the UI
private static readonly SynchronizationContext DefaultContext = new SynchronizationContext();
public Controller()
{
Task.Factory.StartNew(this.Monitor, ct, TaskCreationOptions.LongRunning);
}
public async Task<Result> ActionOnHardwareAsync(object parameter)
{
// you may need to synchronize with the monitor method here.
}
// This method monitors hw status, calling back to the UI when something happens
private void Monitor(object state)
{
// Do some stuffs...
this.synchronizationContext.Post(~ your SendOrPostCallback here ~, ~ event from the hw ~);
}
}