在尝试创建并发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>
,则可以避免进行手动同步。