C# 多线程 大量数据实时接收\解析\存储 问题

RT,给定情景:有一数据通道以每条3ms的速率向软件传输数据,每条数据可认识是一个BYTE。现需要将收到的数据进行解析,解析后显示在UI,解析的同时需要对原始数据及解析后的数据进行实时存储。
设想思路:设置接收线程A、解析线程 B、存储线程C、调度线程D
要实现的目标:由接收线程A实时接收数据,线程B对A收到的数据进行解析并传给UI,同时C存储A、B的数据。线程D去调度协调A\B\C线程。
具体实现感觉比较有难度,如何能解决多线程问题的同时保证效率?求大牛讲解,最好能举几个小例子,有大神愿意传道授业解惑者可加QQ:69000597.
不吝惜分,能解决问题的,分都给你。

第1个回答  2013-06-04
1、定义两个线程安全的队列(System.Collections.Concurrent.ConcurrentQueue<T>)a跟b,其中a用于储存接受的数据,b用于储存要持久化的数据。
2、线程A循环读取数据并储存到队列a中。
3、线程B循环从队列a中读取数据。
3.1、如果读取到数据
3.1.1、将解析前的数据跟解析后的数据赋值给专门储存它们的类c。
3.1.2、将类c添加到队列b中。
3.1.3、将解析后的数据显示到UI线程中。
3.2、如果没有读取到数据,则sleep一定时间。
4、线程C循环从队列b中读取数据。
4.1、如果读取到数据,则储存数据。
4.2、如果没有读取到数据,则sleep一定时间。
5、线程D可以不要,不过假设数据的处理时间过长,将导致队列长度不断增长,所以线程D可以循环判断队列a跟队列b的长度。假设队列中的对象数量超过特定阀值,则进行一定处理。比如终止程序,比如跳过部分数据,比如停止接收数据等。追问

可否举一个小例子呢?对线程安全这块了解的不深。是否需要用到线程锁呢,用那种锁更合适一些?再考虑线程A\B\C等于都在调用同一个数组,怕产生死锁。接收到的数据时数据采集设备发来的连续实时数据。可否加下QQ解答下呢?

追答

好我加你。
如果按照上面的方法写,并且没有引入其它变量的话,不需要加锁。
ConcurrentQueue本身是线程安全的队列。

本回答被提问者采纳
第2个回答  2013-06-04
不明白你要解决什么问题。。。
只是存储线程只有一个的话,貌似是不够的,而且数据库很有可能是一个瓶颈追问

不涉及到数据库,所谓的数据通道是通过硬件进行的数据采集得到的高速大量数据。

C# 多线程 大量数据实时接收\\解析\\存储 问题
3.1.1、将解析前的数据跟解析后的数据赋值给专门储存它们的类c。3.1.2、将类c添加到队列b中。3.1.3、将解析后的数据显示到UI线程中。3.2、如果没有读取到数据,则sleep一定时间。4、线程C循环从队列b中读取数据。4.1、如果读取到数据,则储存数据。4.2、如果没有读取到数据,则sleep一定时...

初学C#,现有 多线程处理数据问题: 有1000条记录,每条记录都要这样处理...
你要明白多线程的作用是异步处理,而不是提高速度(哪怕你的cpu是一万核的也白搭,那只能说明你电脑的处理性能很高),因为所谓多线程其实是“伪线程”,创建越多的线程,则会越多的分散资源和占用资源。所以使用线程只是为了你在后台处理这1000条数据的时候,你的程序还能正常运行,而不会“卡死”。那...

C#多线程实现大量文件读取
1、读取所有的文件名,按照需求,分成90个字符串数组 2、启动thread线程或者delegate委托事件来执行文件的读取,传递的参数就是上面的数组中的一个 3、线程中读取文件列表的方法。这个要看你要做什么了。我不知道你读取文件要做什么,如果要插入资料库的话,你还得考虑不同线程读取资料库会不会锁表。具...

...使用多线程监听多个串口,在进行数据接收的过程中,不定时地会出现如图...
已经有线程把打开的端口关闭了,也可能是设备本身掉线了或者被移除了,所以这个handle不能用了,基本每个线程应该对应一个固定的端口,并且接收完成了应关闭并保持监听状态准备下一次接受,提前要知道接收内容的大小。还有格式要正确,二进制和文本模式是不同的 ...

c#多线程写数据库的问题
写线程是不能并发的(无意义,且易死锁),可以考虑设置双队列。并发线程将接收的数据插入队列,然后用一个线程不断的处理将另一个队列的数据写入磁盘,写入工作的线程处理完队列A后和并发接收线程切换一下,写队列B的数据,并发接收线程向A中写数据,这是简单的,也可以设置三个队列切换。甚至更多。看...

C#实现的多线程异步数据包接收器框架
数据包接收服务器) 系统的核心进程类 建立Socket连接 处理与存储数据包 清理系统资源 该类提供全部的public属性和方法 TSession(客户端会话) 由每个客户端的Socket对象组成 有自己的数据缓冲区 清理线程根据该对象的最近会话时间判断是否超时 TDatagram(数据包类) 判断数据包类别 解析数据包 ...

C# 多线程数据混乱的问题
多线程操作中,各个线程如果是同时运行的话,他们的执行先后顺序是不确定的,多线程就这样,即使它偶然出现了跟你预期的顺序一样,那也只是巧合罢了 而且你多线程里有都是用了textBox1这个资源,他们会抢用,按理说你应该在各个线程中先把这个资源锁住,用完了以后再释放 ...

c#串口一直接收数据在哪个线程
子线程串口接收数据,需采用多线程的子线程来接收。C#是微软公司发布的一种面向对象的、运行于NET Framework和NET Core(完全开源,跨平台)之上的高级程序设计语言。

C# richTextBox实时更新显示串口接收的数据,如果接收的数据频率高时,窗...
如果没什么问题的话,可以试试加一个缓冲区域,比如说用系统自带的微软消息队列MSMQ,收到数据之后把要显示的消息丢到队列里,让队列去自动触发显示在richtexbox上。看看效果怎么样,如果还是不行那就考虑一下多线程了,相关知识建议了解一下。(注:其实数据量大的时候,显示出来也没什么意义了,建议考虑...

使用C# serialport类,用委托进行串口数据接收,接收时需要数据处理和绘图...
只说原理 你的需求实际上是一个简单的生产者和消者费的关系,需要用到多线程,你可以按这个关键字去查一下 生产者 消费者 c 1、串口数据不能固定长度的,即使你下位机发出47字节,你收到数据时也可能会分成多个部分接收。2、serialport有数据到达时的触发事件,不需要你去定时接收数据,头部判断...

相似回答