如何实现多线程/任务观察器模式?

时间:2019-05-30 08:23:07

标签: c# multithreading task observable

我正在研究DAQ /仪器套件,该套件应将大量(双型)阵列数据从/向硬件设备中推送。 DAQ板或声卡。每个HW设备都有一个缓冲区,并在输入缓冲区已满时调用回调。缓冲区应被推入多个SW仪器中,例如示波器和频谱分析仪。每个工具以及设备驱动程序应在单独的线程/任务中运行。我的意图是每秒处理大约一百万个双点。

对于推送数据,我研究了IObservable / IObserver,并进行了初始测试,该测试无需线程即可工作。数据类型如下

public interface IAnalogInArrayData
{
        int NumberOfChannels { get; }
        int NumberOfPoints { get; }
        string[] XUnits { get; }
        string[] YUnits { get; }

        double[][] GetXData();
        double[][] GetXYata();
}

double [] []最多可以达到[8] [10000],每100毫秒更新一次。

现在,我想转向多线程(或任务)。我做了一些研究,但对可用的替代方案有些困惑:

  • 根据旧的SOF帖子(很遗憾,我丢失了它),应将Iobservable / IObserver替换为Reactive扩展和Subject。但是,根据MSDN,Rx简介页面不再更新,但是没有建议应使用的内容。
  • TPL:这似乎是一个高性能的多线程框架,但是我迷失了所有选择,

如何使IObservable / IObserver线程安全? 我应该跳过线程并直接使用任务吗? 我应该使用Rx,TPL还是缺少其他选择? 每种方法的优缺点是什么? 反馈非常感谢。

对于推送数据,我研究了IObservable / IObserver,并进行了无需线程即可工作的初始测试,请参见随附的代码。

0 个答案:

没有答案