gpt4 book ai didi

c# - ConcurrentQueue 类真的是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:42 26 4
gpt4 key购买 nike

我正在串行端口上快速接收数据,而在其他线程中我正在处理串行端口上接收到的数据包。因此,对于线程安全的读写操作,我使用并发队列。以下是我在串行端口上接收数据的代码,我存储在并发队列中。

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());
}
}

以下是在后台线程中运行的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());
}
}

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

最佳答案

您应该真正使用 TryPeekTryDequeue 返回的返回值。如果它们返回 false(例如,因为队列中没有任何内容),您将以 0x00 结束。

关于c# - ConcurrentQueue<T> 类真的是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com