在尝试创建并发Socket操作时,我创建了以下代码:

ConcurrentQueue<byte[]> messageQueue;
ManualResetEvent resetEvent;
Thread outThread;   // -> new Thread(BeginSending);

public void BeginSending() // invoked by outThread
{
    while (true)
    {
        resetEvent.WaitOne();
        while (messageQueue.Count > 0)
        {
            byte[] msg;
            messageQueue.TryDequeue(out msg);
            // send msg via socket
        }
        resetEvent.Reset();
    }
}

public void QueueMessage(byte[] msg) // invoked by the main thread
{
    messageQueue.Enqueue(msg);
    resetEvent.Set();
}

在其他线程迭代/出队时将项目添加到ConcurrentQueue是一件危险的事情吗?

根据我的理解,许多同步集合仅具有单独的同步方法,但是对于concurrentQueue和类似的集合也是如此吗?

最佳答案

ConcurrentQueue本身可以,只要您不对存储为元素的数组进行变异即可。

但是,使用ManualResetEvent的使用模式建议有一个更好的解决方案:如果使用 BlockingCollection<T> ,则可以避免进行手动同步。

10-01 12:33