任务、长时间运行的任务、设备远程操作通信中的线程(串行、IVI.NET、原始TCP) 上下文

任务、长时间运行的任务、设备远程操作通信中的线程(串行、IVI.NET、原始TCP) 上下文,.net,asynchronous,serial-port,task-parallel-library,communication,.net,Asynchronous,Serial Port,Task Parallel Library,Communication,虽然这个问题并不重要,但在一定的背景下,这个问题可能更容易理解(对未来的读者也是如此) 我正在为我的公司开发一个应用程序,用于对不同类型的传感器(压力、温度、流量等)进行自动测量。 此应用程序需要与各种“真实”测量仪器(数字万用表、烘箱、校准器、电源等)进行通信 这些文书将传达: 通过使用串行端口的串行通信 通过使用原始TCP的lan串行 通过GPIB、LAN,使用IVI共享驱动程序 所有使用串行通信的仪器都有读控制字符,用于定义响应的结束(用于串行端口和插座) 我已经为通过串行端口控制的每

虽然这个问题并不重要,但在一定的背景下,这个问题可能更容易理解(对未来的读者也是如此)

我正在为我的公司开发一个应用程序,用于对不同类型的传感器(压力、温度、流量等)进行自动测量。 此应用程序需要与各种“真实”测量仪器(数字万用表、烘箱、校准器、电源等)进行通信

这些文书将传达:

  • 通过使用串行端口的串行通信
  • 通过使用原始TCP的lan串行
  • 通过GPIB、LAN,使用IVI共享驱动程序
所有使用串行通信的仪器都有读控制字符,用于定义响应的结束(用于串行端口和插座)

我已经为通过串行端口控制的每个仪器创建了一个“驱动程序”(即具有通过发送和读取命令和响应来控制仪器的属性和方法的类),该串行端口具有一个
通信器
属性,负责通过正确的接口发送/接收数据。这样我就可以在其他应用程序中重用它

IVI共享兼容设备附带一个IVI.NET驱动程序,该驱动程序已经公开了一个友好的API来控制它们

在我的应用程序中,我定义了一组代表不同类型的接口,如
IDmm
ICalibrator/ICalibrator
IOven
等,并创建了适配器以使每个驱动程序适应支持的接口

该应用程序已投入生产,并“按预期”运行:p同步通信

主意 是否应使用TPL进行异步通信,即使用for.
任务读取值()
而不是
数量读取值()
,如果是,应如何正确进行

我的理解 据我所知(如果我正确理解了第三方物流):

  • 设备通信是一个阻塞I/O绑定过程。
    • 通过有线/空中发送和接收命令和响应需要一些时间在某些情况下,由于不同的原因,可能需要很长时间。
    • 设备需要计算和回答,这也需要时间在某些情况下,由于不同的原因,可能需要很长的时间。(例如,DMM可能需要几秒钟的时间进行测量,因为需要多次采样,压力校准器才能读取实际压力)
  • 接收时计算值(即使用值进行计算等)也是一个阻塞过程在某些情况下,由于不同的原因,可能需要很长时间。
    • 如果所有工作都发生在CPU中,则只能绑定CPU;如果请求一些外部数据(来自db、api、文件…),则也可以绑定I/O
  • 然后,整个测量是CPU绑定和I/O绑定阻塞过程的混合,也可以看作是单个过程这肯定需要一些时间
因此,调用堆栈的基本图表如下:

  • Measurement.Run()
    (开始测量)调用
    • DeviceAdapter.DoSomething()
      (创建字符串命令和发送/接收或调用IVI驱动程序方法),该方法调用
      • Communicator.SendCommandReceiveResponse()
        (通过导线发送和接收)=>这将是一个串行端口、插座或“IVI驱动程序方式”
当然,在进行测量时,不应在测量期间阻塞主线程。这项工作应该在“后台”即另一个线程中进行,因此可以同时运行多个测量

问题: 我应该让所有方法返回任务吗?如果是,如何返回?即我应该做什么:

  • await Measurement.Run().ConfigureAwait(false)
    (开始测量)调用
    • await DeviceAdapter.DoSomething().ConfigureAwait(false)
      (创建字符串命令和发送/接收或调用IVI驱动程序方法),该方法调用
      • await Communicator.SendCommandReceiveResponse().ConfigureAwait(false)
        (通过线路发送和接收)=>这将是串行端口、套接字或“IVI驱动程序方式”
或者我应该只使通信同步并从适配器方法返回任务吗

  • wait Measurement.Run().configurewait(false)
    • await DeviceAdapter.DoSomething().ConfigureAwait(false)
      • 返回任务.Run(Communicator.SendCommandReceiveResponse)
或者我应该使所有的测量同步,并将其包装在一个我返回的任务中,以及如何返回?即:

Task Measurement.Run()=>Task.Run(RunMeasurement)
Task Measurement.Run()=>Task.Factory.StartNew(RunMeasurement,TaskCreationOptions.longlunning)
Task.Factory.StartNew
在这里是一个不错的选择,因为它不会在这个长时间运行的过程中使用线程池线程。
(?)

void RunMeasurement()=>{DeviceAdapter.DoSomething()…}

<哪些任务(如果声明为一个),我应该考虑长时间运行吗?< /P>
  • Measuement.Start()
  • DeviceAdapter.DoSomething()
    如果它调用的方法是长时间运行的,那么它将是长时间运行的
如果all async way是正确的路径,那么如果我是对的,我就不应该使用
Task.Factory.StartNew
创建测量任务,如

Task Measurement.Run()=>Task.Factory.StartNew(异步()=>
{
等待设备适配器。DoSomething();
...
...
},TaskCreationOptions.LongRunning);
因为它没有任何意义,并且创建了一条不必要的线程, 也不要使用类似的东西(这将使运行代码成为可能)