C# 在UWP中,如何从一个线程收集数据并在另一个线程上处理?时机问题
这是一个时间紧迫的问题,我正努力想办法解决这个问题。我的UWP应用程序通过串行通信与一些自定义硬件接口。它每秒收集大约164千字节的数据,硬件以每61微秒10字节的速度对其进行严格计时,因此在0.999424秒内收集所有数据。这是为了让我能够解调提取出某些感兴趣的量 这样做的要求是,我必须将数据采集间隔超过一秒钟。对于我正在使用的平台,解调算法大约需要200毫秒,因此到目前为止,我一直在使用间隔为1250毫秒的C# 在UWP中,如何从一个线程收集数据并在另一个线程上处理?时机问题,c#,uwp,timing,C#,Uwp,Timing,这是一个时间紧迫的问题,我正努力想办法解决这个问题。我的UWP应用程序通过串行通信与一些自定义硬件接口。它每秒收集大约164千字节的数据,硬件以每61微秒10字节的速度对其进行严格计时,因此在0.999424秒内收集所有数据。这是为了让我能够解调提取出某些感兴趣的量 这样做的要求是,我必须将数据采集间隔超过一秒钟。对于我正在使用的平台,解调算法大约需要200毫秒,因此到目前为止,我一直在使用间隔为1250毫秒的Dispatchermer。它触发的事件启动与硬件的通信,侦听直到指定的缓冲区满了(1
Dispatchermer
。它触发的事件启动与硬件的通信,侦听直到指定的缓冲区满了(1秒),然后处理数据(高达100毫秒,大约)然后闲置,直到1250毫秒结束。冲洗并重复
这样做的缺点是数据丢失。在24小时内,我丢失了17280个读数,我的时间戳变得很奇怪。我想每秒记录一次读数(在计算机计时的现实范围内)
我目前正在研究使用System.Threading.Timer
每隔1000毫秒触发一次事件,我想做的是在System.Threading.Timer
事件中收集数据,并在后台处理该数据,同时下一次勾选收集新批次
我应该注意的是,我仅限于使用UWP。我被锁定在运行Windows IoT的Raspberry Pi中。你的问题太广泛了。但是,有一些有趣的问题:在Windows上运行的任何计时器的分辨率都是有限的。你永远不会让你的代码始终精确地每1000毫秒运行一次。如果你的目标是不丢失任何样本,那么对我来说,正确的做法是不断地读取数据(您可以使用
串行端口
类异步执行此操作),然后在缓冲数据时,使用秒表
测量自当前数据块启动以来经过的时间(用每个数据块重置秒表
),然后将当前块交给另一个线程处理。有关托管代码内置的生产者/消费者数据结构,请参见BlockingCollection
。@PeterDuniho我支持您直到“然后将当前块交给另一个线程处理”…您对如何实现这一点有什么建议吗?“您对如何实现这一点有什么建议吗?”--请参阅我之前的评论。我希望该类能够在您看似简单的场景中工作,但您也可以查看,它有更多功能来简化更复杂场景的实现。