C#队列和枚举器有2个线程

时间:2015-12-16 04:06:18

标签: c# multithreading

我有2个帖子:

线程A:它将项目放入队列

toDoReuqests.Enqueue(item);

线程B:它从队列中获取项目

var iterator = toDoReuqests.GetEnumerator();
while ( iterator.MoveNext() )
{
    Console.WriteLine("Tolto dalla coda B");
    Console.WriteLine(iterator.Current.id);
}

从队列中删除项目是否正确?多线程可以在枚举器上给我一个错误吗?

2 个答案:

答案 0 :(得分:3)

是的,您将遇到2个线程和简单队列的问题。建议 - 使用ConcurrentQueue。这是线程安全的。

主题A:

toDoReuqests.Enqueue("test");

主题B:

string retValue;

while(!toDoReuqests.TryDequeue(out retValue))
{
    Console.WriteLine("Tolto dalla coda B");
    Console.WriteLine(retValue);    
}

从队列中删除项目使用方法Dequeue或TryDequeue。

答案 1 :(得分:1)

您的代码将从队列中删除项目,它将简单地迭代它们。你需要做这样的事情:

while ( queue.Count > 0 )
{
    var current = queue.Dequeue();
    Console.WriteLine("Tolto dalla coda B");
    Console.WriteLine(current);
}

此外,代码不是线程安全的,您需要queue的线程安全实现,或者使用locks保护它