如何在c#中锁定队列计数为零的代码段

本文关键字:代码 队列 锁定 | 更新日期: 2023-09-27 18:14:10

我有一种情况,我需要在c#中锁定一段代码,当System.Collections.Generic.Queue<T>Count为零时。也就是说,当它有0个对象时,应该锁定特定的代码段,一旦它的计数增加,应该解锁该代码段。

Queue<WordApplicationWrapper> myQ = new Queue<WordApplicationWrapper>();
lock( if myQ.Count==0 )
{
    app = (WordApplicationWrapper)myQ.Dequeue();
}

如何做到这一点?

如何在c#中锁定队列计数为零的代码段

BlockingCollectionGetConsumingEnumerable代替。

BlockingCollection<WordApplicationWrapper> collection = new BlockingCollection<WordApplicationWrapper>();
foreach (var item in collection.GetConsumingEnumerable())
{
}

在集合中没有项时在foreach块上方,当得到一个项时开始枚举。当您调用collection.CompleteAdding()

时,它将结束。

听起来你确实在寻找BlockingCollection.GetConsumingEnumerable.

当您对结果枚举对象执行foreach时,您的代码将在集合为空时阻塞,并在添加新条目时恢复。注意,BlockingCollection将使用ConcurrentQueue作为默认的备份存储。

简单的想法,将代码封装在一个函数中,并像这样调用它。

//obj is your locker object
if (queue.Count ==0)
{
    lock(obj)
    {
         YourCode();
    }
}
else
{
    YourCode();
}
这不是你想要的吗?