任务之间共享的列表

时间:2016-02-21 19:36:02

标签: c# multithreading

我正在使用一个线程来解析数据包并添加到列表中,然后我使用其他线程来查找该列表并解析数据包。

我可以收到数据包并将它们添加到列表中,不知何故另一个线程仍在使用列表的过时版本。我试图使用锁来读取/写入它但仍在发生。

private class SocketInformation
{
    public bool open { get; set; }
    private ConcurrentQueue<byte[]> packetReceiveQueue = new ConcurrentQueue<byte[]>();

    public ConcurrentQueue<byte[]> GetPacketReceiveQueue()
    {
        return packetReceiveQueue;
    }
}

private void NewConnection(StreamSocket socket)
{
    SocketInformation socketInformation = new SocketInformation();
    socketInformation.open = true;
    Task.Run(() => ReadPackets(socket, socketInformation));
    Task.Run(() => OnlineLoop(socket, socketInformation));
}

private async void ReadPackets(StreamSocket socket, SocketInformation socketInformation)
{
    // ...
    Debug.WriteLine("Packet received.");

    ConcurrentQueue<byte[]> packetReceiveQueue = socketInformation.GetPacketReceiveQueue();
    packetReceiveQueue.Enqueue(packet);
}

private async void OnlineLoop(StreamSocket socket, SocketInformation socketInformation)
{
    while (socketInformation.open)
    {
        ConcurrentQueue<byte[]> packetReceiveQueue = socketInformation.GetPacketReceiveQueue();

        for (int i = 0; i < packetReceiveQueue.Count; i++)
        {
            Debug.WriteLine("Parsing packet.");
            byte[] packet = packetReceiveQueue.ElementAt(i);
            ParsePacketSequence(socket, socketInformation, packet);
        }
    }
}

控制台:

  1. 收到数据包。
  2. 已添加到队列中。
  3. 解析数据包。
  4. 收到数据包。
  5. 打包已添加到队列中。
  6. (第二个数据包未解析,列出过时)

1 个答案:

答案 0 :(得分:1)

内置了Thread-Safe Collections .net。找到最适合您需求的产品。 (看起来ConcurrentQueue最好 - 它是FIFO。)