![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C# 多线程 大量数据实时接收\解析\存储 问题
RT,给定情景:有一数据通道以每条3ms的速率向软件传输数据,每条数据可认识是一个BYTE。现需要将收到的数据进行解析,解析后显示在UI,解析的同时需要对原始数据及解析后...
RT,给定情景:有一数据通道以每条3ms的速率向软件传输数据,每条数据可认识是一个BYTE。现需要将收到的数据进行解析,解析后显示在UI,解析的同时需要对原始数据及解析后的数据进行实时存储。
设想思路:设置接收线程A、解析线程 B、存储线程C、调度线程D
要实现的目标:由接收线程A实时接收数据,线程B对A收到的数据进行解析并传给UI,同时C存储A、B的数据。线程D去调度协调A\B\C线程。
具体实现感觉比较有难度,如何能解决多线程问题的同时保证效率?求大牛讲解,最好能举几个小例子,有大神愿意传道授业解惑者可加QQ:69000597.
不吝惜分,能解决问题的,分都给你。 展开
设想思路:设置接收线程A、解析线程 B、存储线程C、调度线程D
要实现的目标:由接收线程A实时接收数据,线程B对A收到的数据进行解析并传给UI,同时C存储A、B的数据。线程D去调度协调A\B\C线程。
具体实现感觉比较有难度,如何能解决多线程问题的同时保证效率?求大牛讲解,最好能举几个小例子,有大神愿意传道授业解惑者可加QQ:69000597.
不吝惜分,能解决问题的,分都给你。 展开
2个回答
展开全部
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的长度。假设队列中的对象数量超过特定阀值,则进行一定处理。比如终止程序,比如跳过部分数据,比如停止接收数据等。
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本身是线程安全的队列。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不明白你要解决什么问题。。。
只是存储线程只有一个的话,貌似是不够的,而且数据库很有可能是一个瓶颈
只是存储线程只有一个的话,貌似是不够的,而且数据库很有可能是一个瓶颈
追问
不涉及到数据库,所谓的数据通道是通过硬件进行的数据采集得到的高速大量数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询