我可以在两个线程之间使用ConcurrentQueue吗?我想检查一下,我不需要明确地“锁定”任何地方。特别要看一下我在COMMENTS中的行,我将在这里放一个小包...
public class PacketCapturer
{
private static ConcurrentQueue<Packet> _packetQueue = new ConcurrentQueue<Packet>();
public PacketCapturer(IPHostEntry proxyDns, ref BackgroundWorker bw)
{
// start the background thread
var backgroundThread = new System.Threading.Thread(BackgroundThread);
backgroundThread.Start();
// Start Packet Capture with callback via PacketCapturerCallback
}
private void PacketCapturerCallback(Packet packet)
{
_packetQueue.Enqueue(packet);
}
private static void BackgroundThread()
{
while (!BackgroundThreadStop)
{
if (_packetQueue.Count == 0) Thread.Sleep(250);
else
{
ConcurrentQueue<Packet> ourQueue;
ourQueue = _packetQueue; // COULD I DROP A PACKET BETWEEN HERE
_packetQueue = new ConcurrentQueue<Packet>(); // AND HERE???
Console.WriteLine("BackgroundThread: ourQueue.Count is {0}", ourQueue.Count);
}
}
}
最佳答案
编辑:我认为Mark/Gabe是对的,您不会丢失任何数据包。我会把其余的内容留给大家引用,以防其他人对此有所顾虑。
简而言之,是的。您可能在那里丢失一个或多个数据包。您可能想看看ConcurrentQueue提供了哪些方法来获取/删除其中的一部分,就像您要执行的操作一样。
为什么不尝试TryDequeue,直到它返回false:
else
{
Queue<Packet> ourQueue = new Queue<Packet>(); //this doesn't need to be concurrent unless you want it to be for some other reason.
Packet p;
while(_packetQueue.TryDequeue(out p))
{
ourQueue.Enqueue(p);
}
Console.WriteLine("BackgroundThread: ourQueue.Count is {0}", ourQueue.Count);
}
关于c# - 我可以在两个线程之间使用ConcurrentQueue吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3296413/