![]() |
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
您可以考虑使用
优势:
缺点:
|
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |