因此,我有一个线程处理数据并放入队列,然后另一个线程将信息取出并对其执行一些操作。C#中的并发静态队列不保留我的数据
这里是队列
public static class MyConcurrentQueue
{
public static ConcurrentQueue<cRule> _Queue;
public static void EnqueueRuleTrigger(cRule _Rule)
{
MyConcurrentQueue._Queue.Enqueue(_Rule);
}
}
上的Application_Start我有
MyConcurrentQueue._Queue = new ConcurrentQueue<cRule>();
如果我想排队的规则,我使用
MyConcurrentQueue.EnqueueRuleTrigger(_Rule); //We're done enqueue the rule
出队我用
MyConcurrentQueue._Queue.TryDequeue(out _Rule)
我注意到,如果在一个紧凑的循环排队2项,1后,其他由第一离队[单独的非同步线程]时,在日志文件中的数据没有了匹配排队
如果我在队列之间进行睡眠,那么日志会读取正确的值,可能是因为一个项目被放入,被取出,另一个项目被放入,被取出。
我想这是因为队列是静态的,它存储对_Rule的引用而不是其副本。关于如何解决这个问题的任何想法?我需要队列可以被多个线程访问,这就是为什么我首先使它成为静态的原因。
在此先感谢。
编辑
这是我入队和日志和出队和逻辑日志
while (x<=y)
{
MyConcurrentQueue.EnqueueRuleTrigger(_Rule); //We're done enqueue the string AllText = File.ReadAllText(@"C:\Default\New.txt");
File.WriteAllText(@"C:\Default\New.txt", AllText + "\r\nEnqueue Alert:" +
_Rule.AlertID +":" + _Rule.TriggerStartTime + "-" + _Rule.TriggerEndTime);
}
这是一个单独的线程
if (MyConcurrentQueue._Queue.TryDequeue(out _Rule))
{
... some logic
File.WriteAllText(@"C:\Default\New.txt", AllText + "\r\nDequeue Alert:" +
_Rule.AlertID + ":" + _Rule.TriggerStartTime + "-" + _Rule.TriggerEndTime);
}
这是我的日志文件
Enqueue Alert:64c88289-58a1-499b-ade9-3 fa69a32cf47:2012/4/27 12:00:00 PM-4/27/2012 5:00:00 PM
Enqueue Alert:64c88289-58a1-499b-ade9-3fa69a32cf47:2012/4/28 2:00 :00 PM-4/28/2012 9:00:00 PM
Dequeue Alert:64c88289-58a1-499b-ade9-3fa69a32cf47:2012/4/28 2:00:00 PM-4/28/2012 9 :00:00 PM
出列提醒:64c88289-58a1-499b-ade9-3fa69a32cf47:2012年4月28日下午二点00分00秒-4 /二千○十二分之二十八下午9时00分○○秒
到目前为止没有什么特别的代码错误,但它不是很清楚什么是失败。附注:在发布示例代码时,请考虑遵循C#编码指南,即不要以小写字母(cRule)开头的名称类。 – 2012-04-27 04:19:27
我会检查编码准则,谢谢:) 对不起,我有一个日志文件,当我入队时,当我出列。 如果我有2项,说A和B a.value中= 1 B.value = 2 我会看起来像 排队值1 出列值2 排队值2 出列值的日志文件2 考虑我在一个线程的循环中排队A和B,并以另一个线程异步排队它们。看起来问题是第二次入队在紧密循环中会覆盖第一个入队队列的值。如果我在排队之间进行睡眠,日志会读取适当的值。 – Jordan 2012-04-27 04:26:45
这使我最终相信我有某种参考问题。因此,一旦队列中的值正确,我就入队一次并出队[因为我把睡眠放在那里以确保在日志写入之前没有发生第二次入队]。 没有睡眠本质上,第一个对象的第一个出列具有第二个对象的值[与第二个对象一样] – Jordan 2012-04-27 04:31:01