- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 TcpClient
编码一个服务器/客户端项目和 NetworkStream
对象。我希望许多客户端连接到服务器,这些客户端存储在 List<>
中定制NetworkNode
对象,每个对象都有一个 TcpClient
和一个 NetworkStream
用于与相应客户的沟通。
服务器需要能够保持与客户端的连接,并在接收到消息时立即(快速)等待和操作消息。同步轮询对于这个应用程序来说是非常不受欢迎的,我也不希望以这种方式进行编码。
目前服务器正在异步接受客户端并将它们添加到 List<>
,工作非常顺利。我已经使用控制台应用程序对此进行了测试,该应用程序最多可生成 100 个客户端,并在很短的时间内(< 1 秒)连接到环回地址处的服务器。
当客户端添加到 List<>
时该对象使用 GetStream()
方法返回客户端的 NetworkStream
目的。我正在尝试使用 NetworkStream.BeginRead()
从每个 TCP 客户端实现异步数据接收的方法。对该方法的第一次调用如下:
this.Stream.BeginRead(readBuffer, readBufferOffset, readBuffer.Length - readBufferOffset,
new AsyncCallback(nodeStreamReadCallback), this.Stream);
因为控制台测试应用程序在连接到服务器后立即发送一些数据,对象的 readCallback(IAsyncResult)
方法几乎立即被调用:
private void readCallback(IAsyncResult ar)
{
NetworkStream _stream = (NetworkStream)ar.AsyncState;
int _bytesRead = 0;
_bytesRead = _stream.EndRead(ar);
this.Stream.Write(readBuffer, readBufferOffset, _bytesRead);
//increase buffer offset value
readBufferOffset += _bytesRead;
//TODO process the received data
...
//wait for the next chunk of data
this.Stream.BeginRead(readBuffer, readBufferOffset, readBuffer.Length - readBufferOffset,
new AsyncCallback(readCallback), this.Stream);
}
我正在执行第二次调用 Stream.BeginRead()
目的是等待下一个数据 block 到达或变得可用,无论何时何地。
当我注释掉对 Stream.BeginRead()
的第二次调用时一切都运行得非常顺利。所有数据都被接收并发送回每个客户端,没有延迟并且线程使用极少(在此过程中平均使用 2 到 3 个额外的线程)。
但是 - 即使只有一个单个客户端已连接,如果我尝试对 Stream.BeginRead()
进行第二次调用在 readCallback()
内方法(如上所述) 我遇到了大量 争用问题。对于单个客户端,第二次调用后 CPU 使用率从大约 0% 跃升至 30% 到 60% 之间,线程数可以从 11 跃升至多达 35。
所以这是一个线程或递归问题,我觉得我应该在等待一些事情,但我不能完全理解这里发生的事情。这与我在 TcpListener.BeginAcceptTcpClient()
中使用的模式相同所以我认为它必须以不同的方式运作。
感谢您提供的所有建议,并在此先感谢您的帮助!
最佳答案
检查您的 _bytesRead
是否为 0,因为这意味着您的流已在远程端关闭。再次在这样的流上调用 BeginRead
将导致一次又一次地直接调用您的回调,读取字节数为 0。
关于c# - 第二次调用 NetworkStream BeginRead() 大规模资源争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042422/
这个小项目背后的想法是开发一个不同的聊天应用程序,我想发送对象而不是纯字符串。到目前为止,这就是我所拥有的。 如果我在构造函数上反序列化,它工作得很好(UserDTO 目前只有 2 个字符串字段),但
我正在尝试写一个 TcpClient执行。我想在处理数据时开始下一次读取,但我不确定何时将字节数组传递给 BeginRead被修改。这是我当前的实现 private void ProcessData(
我无法找到在成功的 HttpWebRequest 后取消/终止异步读取操作的方法。无法设置超时,ThreadPool.RegisterWaitForSingleObject 也不起作用。并且关闭底层套
关于这篇文章: http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.beginread.aspx 是否有关于如何
我需要从我的虚拟 com 端口读取数据并检测消息“Dreq”。一旦我按下连接按钮,它就会连接到我的 COM8 端口并开始读取新线程。我还有一个断开连接按钮,我希望在其中关闭读数并断开与 COM8 端口
我正在用 TcpClient 编码一个服务器/客户端项目和 NetworkStream对象。我希望许多客户端连接到服务器,这些客户端存储在 List<> 中定制NetworkNode对象,每个对象都有
我正在编写一个类,该类公开流的一部分以供阅读。由于可能同时从多个不同的子部分读取数据,因此在任何时候只能进行一个操作。 我想到了在每次操作之前锁定底层流。在 BeginRead 调用周围锁定流是否足以
我正在运行一个有 5000 个 UdpClient 实例的应用程序类,因为我需要在不同的端口上同时传输数据包。 我目前正在使用 System.Timers.Timer ,它在 ThreadPool 上
有一个异步服务器的代码。 Client 发送 Header - Data Block + Data Block 的大小。 服务器首先异步读取Header,然后读取Data Block。 我需要在读取数
好的,我想连接到 Socket 并使用 System.Net.Sockets.NetworkStream 类读取网络流。这是我目前所拥有的: NetworkStream myNetworkStream
使用 .NET TcpClient 如果我在关联的网络流上调用了异步 BeginRead(),我仍然可以调用 Write()在另一个线程的那个流上? 或者我是否必须 lock() 从 BeginRea
假设我有一个流链,执行压缩 -> 加密 -> 文件 I/O。 在 C# 中,使用同步 I/O,它看起来像这样: int n=0; byte[] buffer= new byte[2048];
运行这段代码时: private async void StartChat(Object obj) { TcpClient me = (TcpClient)obj; UpdateCha
当使用异步代码通过 BeginXXX/EndXXX 模式从流等中读取时,我相信在调用 EndXXX 时会抛出在此过程中发生的任何异常。 这是否意味着对 BeginXXX 的初始调用永远不会抛出异常,它
我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream 对象中。我使用它的 BeginRead 和 BeginWr
我还不太“了解”async 和 await,我正在寻找关于我将要解决的特定问题的一些说明。基本上,我需要编写一些代码来处理 TCP 连接。它基本上只是接收数据并处理它,直到连接关闭。 我通常使用 Ne
它在 MSDN documentation 中声明那: at the very minimum, your state parameter must contain the connected or
为什么使用 FileOptions.Asynchronous 创建 FileStream 会导致 FileStream.BeginRead 阻塞调用线程? 这是代码片段: private static
我创建了 ReadByteContainer 来存储当前数据,并创建了 ReadByteAsyncCallback 用于回调。是否有更好的替代方案? HRESULT MediaByte
我实现了一个模拟串行端口的 DataReceived 事件的系统,通过使用 BeginRead() 方法触发从 TCPClient 对象的 NetworkStream 读取数据,如下所示: TcpCl
我是一名优秀的程序员,十分优秀!