|
|
1
2
首先,我不会对收到的每条消息都使用新线程。要么启动等待新工作的线程,要么退出,或者使用线程池。 如果在枚举过程中收到invalidooperationexception,则意味着您正在对列表或其他IEnumerable进行迭代。是不是说你在做这样的事?
如果是,请切换到使用实际的队列类,并在while循环中执行此操作:
如果内存可用,则标准的System.Collections.Generic.Queue类不是线程安全的,因此我将使用System.Collections.Concurrent.ConcurrentQueue。 |
|
2
1
异步I/O通常是一个很好的解决方案,可以满足在网络I/O场景中对额外线程的需求。 如果不想阻止读取,请通过 NetworkStream.BeginRead -不需要额外的线程,除非您希望回调将接收数据的长期工作移交给线程池执行。你可以用一个 concurrent collections 在.Net 4中,ConcurrentQueue或BlockingCollection。
如果网络流上没有可用的数据,则此代码可能会导致紧循环。例子
here
建议你必须检查
|
|
|
3
0
将消息复制到当前正在处理的第二个que,并清除传入的que。在复制和清除操作期间,您可能至少需要阻止。 或者,在工作线程被隐藏时将单个消息处理分派给它们。 |
|
|
4
0
您可以考虑使用
优势:
缺点:
|
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |