Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在UWP中,如何从一个线程收集数据并在另一个线程上处理?时机问题_C#_Uwp_Timing - Fatal编程技术网

C# 在UWP中,如何从一个线程收集数据并在另一个线程上处理?时机问题

C# 在UWP中,如何从一个线程收集数据并在另一个线程上处理?时机问题,c#,uwp,timing,C#,Uwp,Timing,这是一个时间紧迫的问题,我正努力想办法解决这个问题。我的UWP应用程序通过串行通信与一些自定义硬件接口。它每秒收集大约164千字节的数据,硬件以每61微秒10字节的速度对其进行严格计时,因此在0.999424秒内收集所有数据。这是为了让我能够解调提取出某些感兴趣的量 这样做的要求是,我必须将数据采集间隔超过一秒钟。对于我正在使用的平台,解调算法大约需要200毫秒,因此到目前为止,我一直在使用间隔为1250毫秒的Dispatchermer。它触发的事件启动与硬件的通信,侦听直到指定的缓冲区满了(1

这是一个时间紧迫的问题,我正努力想办法解决这个问题。我的UWP应用程序通过串行通信与一些自定义硬件接口。它每秒收集大约164千字节的数据,硬件以每61微秒10字节的速度对其进行严格计时,因此在0.999424秒内收集所有数据。这是为了让我能够解调提取出某些感兴趣的量

这样做的要求是,我必须将数据采集间隔超过一秒钟。对于我正在使用的平台,解调算法大约需要200毫秒,因此到目前为止,我一直在使用间隔为1250毫秒的
Dispatchermer
。它触发的事件启动与硬件的通信,侦听直到指定的缓冲区满了(1秒),然后处理数据(高达100毫秒,大约)然后闲置,直到1250毫秒结束。冲洗并重复

这样做的缺点是数据丢失。在24小时内,我丢失了17280个读数,我的时间戳变得很奇怪。我想每秒记录一次读数(在计算机计时的现实范围内)

我目前正在研究使用
System.Threading.Timer
每隔1000毫秒触发一次事件,我想做的是在
System.Threading.Timer
事件中收集数据,并在后台处理该数据,同时下一次勾选收集新批次


我应该注意的是,我仅限于使用UWP。我被锁定在运行Windows IoT的Raspberry Pi中。

你的问题太广泛了。但是,有一些有趣的问题:在Windows上运行的任何计时器的分辨率都是有限的。你永远不会让你的代码始终精确地每1000毫秒运行一次。如果你的目标是不丢失任何样本,那么对我来说,正确的做法是不断地读取数据(您可以使用
串行端口
类异步执行此操作),然后在缓冲数据时,使用
秒表
测量自当前数据块启动以来经过的时间(用每个数据块重置
秒表
),然后将当前块交给另一个线程处理。有关托管代码内置的生产者/消费者数据结构,请参见
BlockingCollection
。@PeterDuniho我支持您直到“然后将当前块交给另一个线程处理”…您对如何实现这一点有什么建议吗?“您对如何实现这一点有什么建议吗?”--请参阅我之前的评论。我希望该类能够在您看似简单的场景中工作,但您也可以查看,它有更多功能来简化更复杂场景的实现。