社区
C#
帖子详情
C#阻塞队列(BlockingCollection<>)数据丢失问题
我刚刚摸到门槛
2019-09-25 06:06:36
写了一个小程序,使用阻塞队列(BlockingCollection<>).
代码链接:https://dylanding1994.github.io/test001/.
主要是通过一个串口接收数据,接收到数据后,将数据放到队列中,
另开一个线程A处理队列数据。这样并没有发生数据丢失的问题。
但增加一个控件B,从队列中拿数据,却发现丢了一个数据,线程A也没有处理。
不太明白这是为什么?求助!(具体请看代码)
...全文
696
7
打赏
收藏
C#阻塞队列(BlockingCollection<>)数据丢失问题
写了一个小程序,使用阻塞队列(BlockingCollection). 代码链接:https://dylanding1994.github.io/test001/. 主要是通过一个串口接收数据,接收到数据后,将数据放到队列中, 另开一个线程A处理队列数据。这样并没有发生数据丢失的问题。 但增加一个控件B,从队列中拿数据,却发现丢了一个数据,线程A也没有处理。 不太明白这是为什么?求助!(具体请看代码)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
u010401455
2019-10-13
打赏
举报
回复
如何解决呢?
正怒月神
2019-09-26
打赏
举报
回复
如果是多播,那么我感觉可能是线程消费时,异常了。
我刚刚摸到门槛
2019-09-26
打赏
举报
回复
blockingCollection它也是线程安全,我运行程序的时候,一对一(生产-消费)没什么问题,大概问题出现在一对多消费吧,
我刚刚摸到门槛
2019-09-26
打赏
举报
回复
找到问题了,线程消费时出问题了,线程挂起的地方不对
大鱼>
2019-09-25
打赏
举报
回复
用线程安全队列,如2#,阻塞对接没用过
秋的红果实
2019-09-25
打赏
举报
回复
只用过concurrentqueue,这个是线程安全的。 没用过你说的 C#动东西太多了,更新的也太快
wanghui0380
2019-09-25
打赏
举报
回复
BlockingCollection 并不是topic这类一对多消费的。 一个消费然后多播委托出去。另外消费的时候请try,不然线程异常挂掉,消费就停止了
C#
基于异步事件回调多线程容器
上传项目不支持Firefox,提示代码附件太大(1.4M),我写了30多分钟的描述全没了,太坑爹了。 10分有点贵,绝对原创,共2个代码文件300多行,下载请谨慎。你下载了,若绝对不爽在评论中说出来,不要让其他同学上当,如果觉得还可以也请留言。 代码采用多工作者多线程执行任务。通过暴露的方法往工作者传递消息,然后采用事件回调返回处理结果,实现的事件有OnThreadComplete,OnAddedTask,OnStart,OnSuccess,OnFailure,OnTimeout。 事件回调支持同步或异步,每工作者可以指定执行超时时间,避免线程阻塞死掉。队列采用线程安全的
Blocking
Collection
,每组工作者用一个队列。委托采用Func来定义的,没有采用传统且不太好理解的Delegate。这让代码减少很多,也更容易理解。多线程应该采用消息中心来交换
数据
,这样就规避了线程同步交互,等待,阻塞等等,全部是异步调用,全部是接收消息工作,然后产生消息,线程间没有耦合,消息中心有很多成熟的方案如RabbitMQ, Redis(里面有简单的消息交换),微软有消息云服务等。如果应用不复杂,可以采用DB做个简单的消息中心,建议采用HTTP接口来获取与写入消息,方便将来升级重构消息中心。 开发环境VS2012,Framework4.0,代码注释量很大,如果你高兴这代码你可以随意蹂躏,如果你有建设性意见请告诉我。 下面是部分测试代码: //发送消息方法容器 var msgContainer = new Hashtable(); //创建并启动工作者 foreach (var key in workers.Keys) { //创建工作者 //启动5个线程,异步事件回调,方法执行20秒超时,程序跑起来有100个线程,由于引入超时控制,实际线程将达100+50 //下面的20个工作组,有5个是超时的,主要测试OnTimeout事件,你可以设置seleep的时间来控制 //我把sleep的时间设置的有点长,方便你测试 //测试的时候你会看见有异常,那是应为Timeout我采用的是Thread.Abort方法,这样才出发了ontimeout事件 var worker = new Sehui.Worker(5, key.ToString(), (Func)workers[key], false, new TimeSpan(0, 0, 20)); worker.OnStart += worker_OnEvent; worker.OnSuccess += worker_OnEvent; worker.OnFailure += worker_OnEvent; worker.OnTimeout += worker_OnEvent; //启动工作者 worker.Start(); //将增加消息方法放到Hashtable中 //这里我是偷懒,下面可以用循环的方式往线程中add message msgContainer.Add(key.ToString(), new Func(worker.AddTask)); } //向20个工作者发送消息,每个工作者发送20条消息 for (var i = 0; i < 20; i++) { for (var k = 0; k < 20; k++) { ((Func)msgContainer["SyncDb" + k])("[Work " + k + "] Message " + i); Console.WriteLine("send msg to worker{0},msgid:{1}", k, i); } }
C#
线程安全集合类说明(1):
Blocking
Collection
<T>
线程安全的集合所在的命名空间 using System.
Collection
s.Concurrent; 相应的类:
Blocking
Collection
<T> ConcurrentBag<T> ConcurrentDictionary<Tkey, TValue> ConcurrentQueue<T> ConcurrentStack<T> OrderablePartitioner<TSource> Partitioner.
C#
阻塞队列
Blocking
Collection
Blocking
Collection
是一个比较冷门的类,我们先看下官方对这个类的定义:简单来说,
Blocking
Collection
就是一个线程安全的
阻塞队列
,利用阻塞这个特性,我们可以...
c#
阻塞队列
设计
内存队列,特点是快。但是我们不光是需要快,还要能支持并发的入队和出对。那么看起来ConcurrentQueue<T>似乎能满足我们的要求了,一方面性能还可以,另一方面内置支持了并发操作。但是有一点没满足,那就是我们希望当队列里没有消息的时候,队列的消费者不能让CPU空转,CPU空转会直接导致CPU占用100%,导致机器无法工作。幸运的是,.net中也有一个支持这种功能的集合,那就是:B...
C#
利用线程安全
数据
结构
Blocking
Collection
实现多线程
using System; using System.
Collection
s.Concurrent; using System.
Collection
s.Generic; using System.Threading; using Danny.Infrastructure.Helper; namespace Danny.Infrastructure.
Collection
s { /// &...
C#
110,534
社区成员
642,576
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章