C#多线程之间事件通知的疑难 C#多线程多线程通信事件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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) { ....进行其他较耗时操作 }}? 你搞错了吧要这样子线程1 有数据调用XXXEnQueueprivate 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) { ....进行其他较耗时操作 } }} 那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊 那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊 你去reset()他做啥,根本不用reset();多个线程之间当然可以auto.Set(),你要了解生产者与消费者。关系。而不是一脑子在set reset上 我说的是手动事件reset;您没听懂我的原问题........如果用自动事件会是这样(有问题的):thread1 接data1时加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,接data2后加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,如果thread1中两次set时间间隔很小,thread2只会把waitone走过一次,就不再读数据了........... 大侠们,帮我看看这个问题呗http://bbs.csdn.net/topics/390729548 winsock 调用dll文件的郁闷~ 究竟是HttpWebRequest传值的错,还是HttpWebResponse接收的错误? C# listbox 如何删除和或取多条记录 window编程 .net fastreport 设计问题 怎样做出这种form? C#中如何读取带文件头类型数据 这个是不是DROPDOWNLIST问题 请教EXCEL中所有数据转换为字符串 填充进DataSet中 如何访问网络摄像头,以及视频流的传输问题. c#实现数据结构动态演示系统 C# int i = 01问题
就算你两次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)
{
....进行其他较耗时操作
}
}
?
要这样子线程1 有数据调用XXXEnQueueprivate 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)
{
....进行其他较耗时操作
}
}
}
那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊
多个线程之间当然可以auto.Set(),你要了解生产者与消费者。关系。而不是一脑子在set reset上
您没听懂我的原问题........如果用自动事件会是这样(有问题的):
thread1 接data1时加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,
接data2后加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,
如果thread1中两次set时间间隔很小,thread2只会把waitone走过一次,就不再读数据了...........