我可以在两个线程之间使用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/

10-13 03:07