C# 中的线程安全队列 <t>

Thread safe Queue <t> in C#

我需要创建一个通用队列,它可以在我的多个生产者中排队,并由多个消费者出队。

我希望系统至少尝试两次,以防它在系统更改期间尝试执行操作,因此如果进程线程失败,现在标记的 qBit 将再次排队,然后再次处理时,执行该操作的线程操作将知道另一个线程已经尝试过此操作一次,如果失败,则将此特定线程发送到补救队列以进行外部干预。

所以....对于实际问题,我意识到队列的状态可以在 contains() 和队列操作之间改变,就像套接字检查只是一种错误控制形式,而不是替代。我这样做是因为当两个相同的 id(由 GUID 标识)尝试排队时,两个生产者线程可能会抛出错误,否则将是 qBit 的不同对象实例。

问题是,这样的实现合理吗?我看不到它会陷入僵局,因为所有方法都会 return 而不管处理 qBit 的结果如何,这让我可以在某种程度上阻止其中的一些..

想法和/或第二组眼睛好吗?

public class tsQueue<t>
{
    object syncLock = new object();
    private Queue<qBit<t>> Q = new Queue<qBit<t>>();
    List<t> contents = new List<t>();

    public qBit<t> deQueue()
    {
        lock (syncLock)
        {
            qBit<t> pop =  Q.Dequeue();
            contents.Remove(pop.item);
            return pop;
        }
    }

    public void enQueue(qBit<t> push)
    {
        lock (syncLock)
        {
            contents.Add(push.item);
            Q.Enqueue(push);
        }
    }

    public bool contains(t check) {
        lock (syncLock)
        {
            return contents.Contains(check);
        }
    }

    public class qBit<t>
    {
        public bool flag { get; set; }
        private t _item;
        public t item { get { return _item; } }

        public qBit(t item)
        {
            this._item = item;
        }
    }
}

ConcurrentQueue 是一个线程安全的实现,它完全可以满足您的需求。它也肯定会比您自己的代码更快。使用此 link 查看 ConcurrentQueue 实现的源代码。