C#多线程之间事件通知
2016-05-07 21:56
821 查看
我有两个线程, 线程1接受网络数据,存到队列; 线程2取队列,进行各种复杂的处理然后绘制到界面上; 想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西,很费cpu,怎么弄? 我现在用的是C#的ManualResetEvent,线程1给队列中加数据时,置为有信号, 线程2中,队列为空置为无信号,这样问题是置了好多个有信号,好浪费 也想过有AutoResetEvent,就怕两次set激活事件时间间隔太短会有问题........ 怎么办啊????,不要循环检查而是等到1的通知 更多0分享到: 相关知识库: C# 虚拟现实(VR) Node.js 算法与数据结构 相关推荐: C#.NET_面向对象编程技术 微信公众平台深度开发Java版 v2.0(第一季)完整版 使用C#开发信息管理系统 Android开发精品课程【Java核心知识】 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 回复次数:10 |
![]() 关注wyd1520本拉灯本版等级: ![]() ![]() ![]() | #1 得分:20回复于: 2014-03-10 22:42:37![]() 请百度 生产者与消费者。。。就会得到你想要的 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注wyd1520本拉灯本版等级: ![]() ![]() ![]() | #2 得分:0回复于: 2014-03-10 22:44:05 AutoResetEvent 用这个没问题的, 就算你两次Set 只要上次没执行完,就是没进入到WaitOne()阻塞,你执行多少次Set都没用 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注lifang123456我爱大家369本版等级: ![]() | #3 得分:0回复于: 2014-03-10 22:56:36 引用 2 楼 wyd1520 的回复: AutoResetEvent 用这个没问题的, 就算你两次Set 只要上次没执行完,就是没进入到WaitOne()阻塞,你执行多少次Set都没用 自动重置事件,两次set时间间隔很小的话,另一个线程WaitOne继续一次的,那就不对了, 线程1: 有数据1->加入队列->AutoResetEvent.set() 有数据2->加入队列->AutoResetEvent.set() 线程2: while(true) { AutoResetEvent.WaitOne(); 取队列 ....进行其他较耗时操作 } 线程2只循环一次,取一次队列啊,我要想取两次值;或者用其他办法,只要让线程2别 这样: whiile(true) { ---------------->这样很消耗cpu,或者会抢占其他线程cpu的 object obj = queue.deueue();//取头元素 if(null == obj) { ....进行其他较耗时操作 } } ? |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注wyd1520本拉灯本版等级: ![]() ![]() ![]() | #4 得分:20回复于: 2014-03-10 23:05:21![]() 你搞错了吧 要这样子 线程1 有数据调用XXXEnQueue private void XXXEnQueue(xxx) 进队列 { lock(queue) { queue.Enqueue(xxx); } auto.Set(); } private xxx XXXDequeue() //取头元素 { lock(queue) { return queue.Dequeue(); } } 线程2 whiile(auto.WaitOne()) 这样就成了 { while(queue.Count>0) { object obj = XXXDequeue(); if(null == obj) { ....进行其他较耗时操作 } } } |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注lifang123456我爱大家369本版等级: ![]() | #5 得分:0回复于: 2014-03-10 23:29:17 那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注lifang123456我爱大家369本版等级: ![]() | #6 得分:0回复于: 2014-03-10 23:30:05 那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注wyd1520本拉灯本版等级: ![]() ![]() ![]() | #7 得分:0回复于: 2014-03-10 23:46:34 你去reset()他做啥,根本不用reset(); 多个线程之间当然可以auto.Set(),你要了解生产者与消费者。关系。而不是一脑子在set reset上 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注lifang123456我爱大家369本版等级: ![]() | #8 得分:0回复于: 2014-03-11 13:19:19 我说的是手动事件reset; 您没听懂我的原问题........ 如果用自动事件会是这样(有问题的): thread1 接data1时加入队列,set触发事件后thread2会把waitone走过后立马变为无信号, 接data2后加入队列,set触发事件后thread2会把waitone走过后立马变为无信号, 如果thread1中两次set时间间隔很小,thread2只会把waitone走过一次,就不再读数据了........... |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 |
![]() 关注lifang123456我爱大家369本版等级: ![]() | #9 得分:0回复于: 2014-03-11 22:00:07 用Monitor.Pulse解决! |
相关文章推荐
- c#还有一点不太明白,既然开启了线程为何还要委托呢?
- C# 多线程操作之异步委托
- C# 多线程控制 通讯 和切换
- C# volatile 关键字
- Longest Substring with At Most Two Distinct Characters
- C#命名空间
- 《CLR via C#》学习笔记【2】
- 采用C#实现软件自动更新的方法
- C# 命名空间
- C#二十七 Dataset和DataAdapter
- C#二十七 Dataset和DataAdapter
- C#二十七 Dataset和DataAdapter
- C#中静态与非静态方法比较
- C#二十六 使用Ado.Net调用存储过程
- C#二十六 使用Ado.Net调用存储过程
- C#二十六 使用Ado.Net调用存储过程
- C#二十四 Ado.Net简介
- C#二十四 Ado.Net简介
- C#二十四 Ado.Net简介
- C# SerialPort的简单使用