4

我有一块硬件通过 PCI 总线连接到我的 PC。我正在通过设备驱动程序周围的 .NET 包装器访问硬件。

我没有关于设备如何执行 PCI 的任何规范。这让我想到了我的第一个问题。

1)通过PCI连接的设备是否保证以一定的速度传输数据?

2) 与设备通信时,我希望我的 UI 保持响应。在(线程池)线程中启动与设备的通信是个好主意,或者与访问 PCI 总线的速度相比,与此相关的开销是否太大?

编辑:
问题重写。过多地反映了漫长工作日的结束。
删除了线程是线程池线程的要求。

4

3 回答 3

4

一般来说,只要有机会编写没有线程关联的代码,这样做通常是个好主意。这样一来,当它成为响应性问题时,您可以自由关闭 UI 线程。使用异步方法为此 I/O 设计您的 API 还可以让您的选项以一种良好的方式向前发展。

如果您不必长时间占用它,您所在的线程是线程池线程还是您自己生成的线程似乎无关紧要。如果你可以做异步 I/O,那么线程池线程应该没问题。

于 2013-02-10T21:22:01.100 回答
3

通过 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 关键字)更容易且不易出错。

于 2013-02-16T18:43:40.447 回答
2

我认为当您需要监控硬件状态时,使用长时间运行的后台线程是有意义的。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 ~);
    }
}
于 2013-02-13T08:32:47.877 回答