- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做过研究,我知道实现高性能套接字服务器的最佳方法通常如下:使用异步套接字操作(专门的 SocketAsyncEventArgs/Operations 以获得最佳性能)和异步回调,将请求推送到由线程池管理的处理队列。
我对这个处理模型的问题 - 获得最好的性能:
1) 什么时候应该调用套接字的“结束”操作(例如 EndAccept 或 EndReceive)?这应该在排队请求之前在回调线程(IOCP)上调用吗?或者当请求从队列中取出并被处理时调用(工作线程)?
2) 这个问题取决于#1 的答案。什么时候应该调用下一个“开始”操作?我们应该在调用 EndOperation 之前调用它,还是应该在 EndOperation 之后立即调用它(在排队/处理请求之前)?
3) 处理队列可以只是 .NET 线程池吗?与推出您自己的同步处理队列相比,使用 .NET 线程池有哪些优点/缺点?
非常感谢任何帮助。
最佳答案
1) EndReceive
应该是您在异步回调中做的第一件事。事实上,在调用 EndReceive
之前,您不能在回调中做任何其他事情,因为这就是为您提供接收到的数据的原因。请参阅 Socket.EndReceive 处的示例.
EndAccept 同样如此,因为它为您提供了您将与之通信的套接字。
2) 您应该在 EndAccept
之后尽快调用 BeginAccept
。否则,如果您的接受回调处理时间过长,您可能会丢失连接请求。当然,如果您的接受回调需要很长时间才能执行任何操作,那么您就做错了。同样,BeginReceive
也是如此:在 EndRead
之后尽快调用它,以避免丢失数据。或者,如果您的通信协议(protocol)是请求/响应模型,客户端希望在发送任何更多数据之前得到响应,您可以等到发送响应后再调用 BeginRead
。
3) 处理可能是 .NET 线程池,但如果您要使用它,您应该考虑使用 Task Parallel Library。使用 TPL 的优势在于它非常“发射后不管”,或者可能是“发射后它会在完成时回调”。使用 TPL 的缺点是您的应用程序更难知道哪些任务未决。如果您创建自己的同步处理队列,您总是知道哪些作业正在等待处理,并且您有可能检查队列、取消作业等。如果您想使用 TPL 执行此操作,您最终会创建一个任务集合你必须管理,因为有 no way to get the the list of pending tasks .
但如果您不需要查看挂起的任务,那么 TPL 应该可以正常工作。
这里的相关问题有一些很好的信息。
关于c# - 超高性能套接字服务器 - 实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7773677/
在C#中,我可以通过base关键字访问基类,在java中,我可以通过super关键字访问它。在delphi中如何做到这一点?假设我有以下代码: type TForm3 = class(TF
在这件事上我已经把头撞到墙上好几次了。所以我希望在正确的方向上得到一点帮助。 我有一张 table ,上面有订单,一张 table 上有火车,一张 table 上有航类,一张 table 上有巴士。每
在 Python 中,假设我有以下代码: class SuperClass(object): def __init__(self, x): self.x = x
我希望这个 subview 扩展到它的父 View 之外,但是父 View 的边框正在切入 subview 。有没有办法防止这种情况? class TheView : UIView { let
我有一个标准的高斯函数,看起来像这样: def gauss_fnc(x, amp, cen, sigma): return amp * np.exp(-(x - cen) ** 2 / (2
例如,我有下一个类,带有有界类型参数: public class ItemContainer { void addItems(List items); } 在另一个带有参数的类中使用: pub
如何将此设置转换为命令? 结果如下: // Manual Compression (see the image above) Compressed Size: 12,647,451 bytes //
请建议在应用继承时如何使用@Wither/@With。 我有一个抽象类Parent和具体的Child。 Child 应该是不可变的。将 @Wither 放在两者上会给我两个错误: 构造函数 Child
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试向服务器(虚拟托管)发出 HTTP2 请求,该服务器根据主机 header 值 (SNI) 提供 SSL 证书。 # conn = hyper.HTTP20Connection('h
我有一个应用程序,必须将大约 1300 万行、大约 10 个平均长度的字符串插入到嵌入式 HSQLDB 中。我一直在调整一些东西(批量大小、单线程/多线程、缓存/非缓存表、MVCC 事务、log_si
我想定义一个函数f(x, t::Type)根据 isa(x, t) 是否执行不同的行为.假设我想调用b1(x)如果是,b2(x)除此以外。 我知道我可以像这样在运行时进行动态检查: function
我正在使用 Hyper-V WMI Provider在 Hyper-V 中导入虚拟机,特别是使用 ImportVirtualSystemEx Msvm_VirtualSystemManagementS
这几个星期以来一直困扰着我,我没有结束对它的研究,因为我目前重载并且它让我落后于第一年的 CS (opengl) 大学类(class),这首先让我研究了这个:如何只用一个 for 循环绘制立方体的所有
我正在我的计算机(操作系统:Windows 8)上开发一个 WP8 应用程序。我需要安装一个 VM 才能拥有 linux。同时我需要使用我的 Windows Phone 模拟器。 我下载了 VMWar
我是一名优秀的程序员,十分优秀!