【发布时间】:2010-11-12 21:52:40
【问题描述】:
我的 TcpServer 中有以下方法
private void Receive(ZClient client)
{
NetworkStream ns = client.TcpClient.GetStream();
int bytesRead = 0;
byte[] message = new byte[client.TcpClient.ReceiveBufferSize];
while (true)
{
bytesRead = ns.Read(message, 0, client.TcpClient.ReceiveBufferSize);
if (bytesRead == 0)
{
break; // Exit Thread
}
else
{
Array.Resize<Byte>(ref client.Buffer, client.Buffer.Length + bytesRead);
Buffer.BlockCopy(message, 0, client.Buffer, client.Buffer.Length - bytesRead, bytesRead);
// Issue Below
DisassembleRawMessage(client); // *1 See below
new Thread(()=>DeQueueMessages(client)).Start(); // *2 See below
// End Issue
}
}
}
DissassembleRawMessage 负责处理我的缓冲区并在我的客户端消息队列中加入单个消息。这里没问题。
DeQueueMessages 负责处理之前在 DissassembleRawMessage 方法中放入我的客户端消息队列的对象。
这个问题可能看起来很明显。收到消息后,我启动了一个新线程。在 dequeing 和处理单个消息的过程中,队列可能添加了更多的项目,因为在中间可能已经收到了更多的数据。这导致枚举错误,提示我在枚举过程中不能修改集合的内容。
我不想通过在同一个线程中处理队列来阻止我的接收方法,因为它会破坏允许队列建立请求的目的,同时仍然接收数据。如何继续对对象进行排队,同时处理队列中的对象而不会遇到枚举修改异常?
更新:使消息出队的方法。
while (client.Queue.Count() > 0)
{
byte[] buffer = client.Queue.Dequeue();
...
}
【问题讨论】:
标签: c# multithreading