C# 是ConcurrentQueue<;T>;类真的线程安全吗?

C# 是ConcurrentQueue<;T>;类真的线程安全吗?,c#,multithreading,C#,Multithreading,我在串行端口上以高速率接收数据,而在另一个线程中,我正在处理在串行端口上接收的数据包。因此,对于线程安全的读写操作,我使用concurrentqueue。下面是我在concurrentqueue中存储的串行端口上接收数据的代码 System.Collections.Concurrent.ConcurrentQueue<byte> receivedData = new System.Collections.Concurrent.ConcurrentQueue<byte>()

我在串行端口上以高速率接收数据,而在另一个线程中,我正在处理在串行端口上接收的数据包。因此,对于线程安全的读写操作,我使用concurrentqueue。下面是我在concurrentqueue中存储的串行端口上接收数据的代码

System.Collections.Concurrent.ConcurrentQueue<byte> receivedData = new System.Collections.Concurrent.ConcurrentQueue<byte>();
private void receiveData(object sender, SerialDataReceivedEventArgs e)
{
    while (connectComPort.BytesToRead > 0)
    {
        receivedData.Enqueue((byte)connectComPort.ReadByte());
    }
}
System.Collections.Concurrent.ConcurrentQueue receivedData=new System.Collections.Concurrent.ConcurrentQueue();
私有void receiveData(对象发送方,SerialDataReceivedEventArgs e)
{
while(connectComPort.BytesToRead>0)
{
receivedData.Enqueue((byte)connectComPort.ReadByte());
}
}
下面是在后台线程中运行的concurrentqueue中处理数据的代码

private void processBuffer()
{
    while (1 == 1)
    {
        try
        {
            List<byte> storeData = new List<byte>();
            if (startProcessState == 0)
            {

                storeData.Clear();
                break;
            }
            if (receivedData.Count() > 7)
            {
                byte first = 0x00;
                receivedData.TryPeek(out first);
                if (startProcessState == 0)
                {

                    storeData.Clear();
                    break;
                }


                if (first == 0x55)
                {
                    first = 0x00;
                    receivedData.TryDequeue(out first);
                    storeData.Add(first);

                    receivedData.TryPeek(out first);

                    if (first == 0xAA)
                    {
                        receivedData.TryDequeue(out first);
                        storeData.Add(first);

                        if (receivedData.TryDequeue(out first))
                        {
                            storeData.Add(first);
                            receivedData.TryDequeue(out first);
                            storeData.Add(first);

                            receivedData.TryPeek(out first);
                            int sizeBytes = (int)first;
                            int numbTimesLoop = sizeBytes - 4;

                            for (int i = 0; i < numbTimesLoop; i++)
                            {
                                receivedData.TryDequeue(out first);
                                storeData.Add(first);
                            }
                            //File.AppendAllText("hello5.txt", BitConverter.ToString(storeData.ToArray()) + Environment.NewLine);
                            modifiedProcess(storeData); //-- Line 1

                        }
                    }

                    else
                    {
                        receivedData.TryDequeue(out first);
                    }
                }

                else
                {
                    receivedData.TryDequeue(out first);
                }
            }
            else
            {
                Thread.Sleep(30);
            }
        }
        catch (Exception ex)
        {
            Log.Error("huge bug : " + ex.ToString());
        }
    }
private void processBuffer()
{
而(1==1)
{
尝试
{
List storeData=新列表();
如果(startProcessState==0)
{
storeData.Clear();
打破
}
if(receivedData.Count()>7)
{
第一字节=0x00;
receivedData.TryPeek(先出);
如果(startProcessState==0)
{
storeData.Clear();
打破
}
如果(第一个==0x55)
{
第一个=0x00;
receivedData.TryDequeue(先出);
storeData.Add(第一个);
receivedData.TryPeek(先出);
如果(第一个==0xAA)
{
receivedData.TryDequeue(先出);
storeData.Add(第一个);
if(receivedData.TryDequeue(先出))
{
storeData.Add(第一个);
receivedData.TryDequeue(先出);
storeData.Add(第一个);
receivedData.TryPeek(先出);
int sizeBytes=(int)first;
int numbertimesloop=sizeBytes-4;
for(int i=0;i

问题是在调用第1行函数之前发生了数据损坏。一些字节被转换为0x00(我已经在发送方端进行了检查,所以正确的数据正在串行端口的另一端发送。)。在第1行之前,如果我将数据写入文件,那么我在写入文件的数据包中看不到此错误。此错误的可能原因是什么?我假设concurrentqueue不是完全线程安全的。

您应该真正使用
TryPeek
TryDequeue
返回的值。如果这些返回值
false
(例如,因为队列中没有任何内容),您将得到一个
0x00

您应该真正使用
TryPeek
TryDequeue
返回的返回值。如果这些返回值
为false
(例如,因为队列中没有内容),你将得到一个
0x00

。如果你跳转到一个被数百万人用作根本性破坏的框架,你很可能是错的,问题在于你的代码。如果你跳转到一个被数百万人用作根本性破坏的框架,你很可能是错的,问题在于你的密码。