|
|
1
11
使用Reflector,您可以看到,不,在添加项目之前,计数不会增加。 正如本所指出的,看起来确实有很多人在叫“出列”。 你说你肯定没有其他东西在叫出列。这是因为只有一个线程调用dequeue吗?是否在其他任何地方调用了“出列”? 编辑:
它运行了多长时间才出现错误?也许你可以分享更多的代码。
|
|
2
3
然而,你说没有其他东西是排队。。。 尝试在if块内输出计数。如果您看到计数向下跳转,则其他人正在排队。 |
|
|
3
3
这里有一个可能的答案 the MSDN page 关于这一主题:
我的猜测是,你是对的——在某个时刻,出现了一个竞争条件,你最终退出了一些不存在的东西。 互斥锁或监视器。锁定可能适用于此。
|
|
|
4
2
“排队”数据的其他区域是否也使用相同的同步队列对象?为了使Queue.Synchronized具有线程安全性,所有入队和出队操作都必须使用相同的同步队列对象。 从…起 MSDN :
编辑: 如果您对许多涉及重计算的项目进行循环,或者如果使用的是长期线程循环(通信等),则应考虑具有等待功能,例如 System.Threading.Thread.Sleep , System.Threading.WaitHandle.WaitOne , System.Threading.WaitHandle.WaitAll 或 System.Threading.WaitHandle.WaitAny 在循环中,否则可能会破坏系统性能。 |
|
|
5
1
问题1:如果您使用的是同步队列,那么:不,您是安全的!但是您需要在供应商和进料器的两侧使用同步实例。 问题2:当没有工作要做时终止工作线程是一项简单的工作。但是,无论哪种方式,您都需要一个监视线程,或者只要队列有事情要做,就让队列启动一个后台工作线程。最后一个听起来更像ActiveObject模式,而不是一个简单的队列(单一负责模式说它应该只进行排队)。 另外,我会选择阻塞队列,而不是上面的代码。代码的工作方式需要CPU处理能力,即使没有工作要做。阻塞队列允许您的工作线程在无事可做时睡眠。您可以在不使用CPU处理能力的情况下运行多个休眠线程。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |