- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在编写一个客户端应用程序,我想知道我是否应该使用 Socket 类的 ReceiveAsync 或 BeginReceive 方法。到目前为止,我一直在使用后者,但是,我发现它似乎对 CPU 造成了很大的压力。这是我的接收循环的基本样子:
private void socket_ReceiveCallback(IAsyncResult result_)
{
// does nothing else at the moment
socket.EndReceive(result_);
byte[] buffer = (byte[])result_.AsyncState;
// receive new packet
byte[] newBuffer = new byte[1024];
socket.BeginReceive(newBuffer, 0, newBuffer.Length, SocketFlags.None,
socket_ReceiveFallback, newBuffer);
}
现在我一直在想我是否在这里做错了什么,因为其他通信的应用程序几乎不会给 CPU 带来压力。而且我想知道使用 SocketAsyncEventArgs 和 ReceiveAsync 是否会更好。
所以这是我的问题:
为什么我的循环对 CPU 的压力如此之大?我应该使用 SocketAsyncEventArgs 和 ReceiveAsync 而不是 BeginReceive 吗?
最佳答案
我一直在本地主机环回连接上对同步和异步套接字进行基准测试。我的结果是异步版本慢了大约 30%。考虑到异步 IO 现在风靡一时,这让我感到惊讶。我使用了多少线程并不重要。我可以使用 128 个线程,但同步 IO 仍然更快。
我认为这是因为异步 IO 需要更多分配和更多内核模式转换。
因此,如果您不希望有数百个同时连接,您可以切换到同步 IO。
关于c# - ReceiveAsync 与 BeginReceive 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915101/
有没有办法使用 Microsoft.Azure.ServiceBus 包来等待当前线程从队列接收消息? 这可能更多是我的理解和以不打算使用的方式使用该技术的愿望的问题,但我想做的是结合 the fol
我已经习惯了同步套接字,但为了达到现在的状态,我有些头疼,尤其是在 Socket.Receive(..) 并不总是接收到所有字节的情况下 这是我以前使用的代码 public byte[] Re
我目前正在开发一个应用程序服务器。我想使用 AcceptAsync 方法。我收到错误消息“对象引用未设置为对象的实例。”调用 ReceiveAsync 方法时。如果有人提出这个问题并得到解决方案? p
我需要为一些旧的 cobol 重新实现数据库连接驱动程序我的一位客户的数据库。应用程序的构建方式,我无法使用async/await (就这样吧,我知道这很愚蠢)。 整个应用程序是一个 ASP.NET
我有一个基于异步Socket的长时间运行的服务程序。当其他设备检测到它的运行状况(短时间 TCP 端口连接和断开连接)时,它的内存使用量会随着时间的推移而不断增加。我怀疑这种类型的 TCP 连接的一些
美好的一天。我使用 UdpClient 并对其进行包装。 为了阅读我有异步方法: private async Task Receive(UdpClient client, CancellationTo
当使用异步套接字时,特别是 Socket.ReceiveAsync,是否可以进行“部分”接收?例如,我想指定我希望 SocketAsyncEventArgs 对象有 1024 个字节,但我只想允许接收
在读取已接收到的少量数据时,我尝试比较同步方法和异步方法的性能。所以我发送数据并确保它正在等待接收套接字(相同的程序)。 source.Send(sendBuffer); while (target.
我打算通过套接字接收数据包,但由于它们是从发送方以高频率发送的,所以它们中的许多被打包到一个 byte 数组中。 SocketAsyncEventArgs.Buffer 然后保存多个数据包,即使它们是
似乎在使用 SslStream 时我无法获得 ReceiveAsync 的好处,因为我必须通过仅支持 Begin* End* 异步模型的 SslStream 进行读取。 是否可以在完成身份验证之前只使
我看过 TCP 的 ReceiveAsync 示例,但没有看过 UDP。 ReceiveAsync 是否与 UDP 兼容?如果是这样,您看到过任何示例吗? 谢谢。 最佳答案 UDP 是面向数据报的协议
我正在使用如下所示的 UDPClient dim c = New UDPClient(port) client.CLient.ReceiveTimeout = 1 await client.Recei
我正在测试以下两种情况,一种有效,但另一种无效。我有套接字服务器和套接字客户端应用程序在两台不同的机器上运行 这两个场景都使用了 socketasynceventargs 场景 1(有效)循环创建 4
服务工作线程有两种方法处理来自 Azure 服务总线队列的消息: while (!ExitRequested) { try { var message = await
我有这段代码通过 UdpClient 发送命令,然后等待响应: cameraListener = new UdpClient(52381); cameraSender = new UdpCl
我正在使用 .NET 4.5.1 运行 C# 控制台应用程序。当我运行以下函数时,下面的 udpClient.ReceiveAsync() 调用会无一异常(exception)地静默终止程序。我该如何
我正在通过 websocket 接收 JSON。至少:我是部分的。使用在线 websocket 服务,我收到完整的 JSON 响应(所有 HTML 标记都被忽略)。当我查看在控制台中收到的 JSON
我目前正在编写一个客户端应用程序,我想知道我是否应该使用 Socket 类的 ReceiveAsync 或 BeginReceive 方法。到目前为止,我一直在使用后者,但是,我发现它似乎对 CPU
我有一个接口(interface) INetwork用一个方法: Task SendAsync(string messageToSend, CancellationToken ct) 接口(inter
我正在编写一个只使用一个套接字的简单套接字客户端。所以我想我可以为所有接收操作重用一个 SocketAsyncEventArgs。只要连接了 socket ,它就可以正常工作。当服务器断开连接时,客户
我是一名优秀的程序员,十分优秀!