我注意到了一个问题,即socketAsynceventargs的。结论事件 似乎停止射击. 。同一SAEA可以正确射击并在泳池中多次替换,但最终所有实例都将停止射击,并且因为在池中更换它们的代码是事件处理程序,所以池倒空。

以下情况 显然也是如此:

1)似乎只有当服务器端插座将数据发送到一个连接的客户端时才发生。当同一类作为客户端连接时,它似乎没有故障。

2)似乎在高负载下发生。线程计数似乎会爬升,直到最终发生错误。

3)在类似压力下的测试钻机似乎永远不会出现故障。 (每秒只有20条消息,并且测试钻机已被证明为20K)

我将无法粘贴相当复杂的代码,但这是 我的代码的描述:

1)主要灵感是: http://vadmyst.blogspot.ch/2008/05/sample-code-for-tcp-server-using.html. 。它显示了如何使用事件连接完成端口,如何通过TCP连接获得不同尺寸的消息等等。

2)我有一个字节缓冲区,其中所有SAEA都有一块,这不会重叠。

3)我有一个基于阻塞汇编的对象库。如果游泳池为空的时间太长,则会抛出。

4)作为服务器,我将插座的集合从AccessAsyNC函数返回,并由客户端的端点索引。单个进程可以将一个实例用作服务器以及多个实例作为客户端(形成Web)。他们共享SAEAS的数据缓冲区和池。

我意识到很难解释这一点。我整天都在调试它。只是希望有人听说过或有有用的问题或建议。

目前,我怀疑某种线程疲惫,导致SAEA无法召集完成。另外,在传出缓冲区上的某种缓冲区问题。

有帮助吗?

解决方案

因此,又有一天的调试,最后我有了解释。

1)SAEAS没有发射完整的活动,因为他们无法发送更多。 Wireshark揭示了这是由于TCP窗口清空。 (TCP Zerowindow)

2)TCP窗口正在排空,因为网络层正在将事件传递到堆栈中,该事件花费了太长时间才能完成,即网络层和UI之间没有生产者/消费者。因此,网络OP必须在发送ACK之前等待屏幕绘制。

3)花费太长时间的事件是在GUI上的活动处理程序中抽出的屏幕。测试钻机是一个控制台窗口(总结了传入消息的窗口),因此这就是为什么它不会在更高的负载下引起问题的原因。不用每条消息上的屏幕重新绘制是正常的,但这是因为项目尚未完成的,这是正常的。雷德率将在稍后固定。

4)短期解决方案仅仅是为了确保没有Guis举起演出。一个更强大的解决方案可能是在网络层创建生产者/消费者。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top