Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net套接字服务::通过事件传递套接字请求对于大规模服务来说是一个愚蠢的想法吗?_C#_Sockets - Fatal编程技术网

C# .Net套接字服务::通过事件传递套接字请求对于大规模服务来说是一个愚蠢的想法吗?

C# .Net套接字服务::通过事件传递套接字请求对于大规模服务来说是一个愚蠢的想法吗?,c#,sockets,C#,Sockets,大多数人似乎构建了一个监听器套接字,并将包含要调用以进行处理的“事件”。例如:SocketConnected,DataReceived。程序员初始化侦听器并绑定到“events”方法以接收套接字事件来构建服务 我觉得在大规模实现中,避免监听器中的委托会更有效。并完成回调方法中的所有处理。在知道下一个命令的基础上,可能使用不同的回调来接收数据。(这是我的消息框架结构的一部分) 我已经到处寻找了高度可伸缩的示例,但我只找到了异步套接字的标准MSDN实现,或者是其他程序员复制MSDN示例的变体 有没有

大多数人似乎构建了一个监听器套接字,并将包含要调用以进行处理的“事件”。例如:SocketConnected,DataReceived。程序员初始化侦听器并绑定到“events”方法以接收套接字事件来构建服务

我觉得在大规模实现中,避免监听器中的委托会更有效。并完成回调方法中的所有处理。在知道下一个命令的基础上,可能使用不同的回调来接收数据。(这是我的消息框架结构的一部分)

我已经到处寻找了高度可伸缩的示例,但我只找到了异步套接字的标准MSDN实现,或者是其他程序员复制MSDN示例的变体

有没有人有什么好的经验可以为我指明正确的方向



注意>该服务将容纳数千个客户端,在大多数情况下,客户端保持连接,服务接收到的更新将发送给所有其他连接的客户端。这是一个面向对象数据库的同步P2P类型系统。

我给你的唯一建议是:使用最清晰的样式

由于无法测量的速度差异而取消整个语言功能还为时过早。方法调用/委托调用的成本不太可能成为代码中的瓶颈。当然,您可以对一种方法与另一种方法的相对成本进行基准测试,但是如果您的程序只花费其设置方法调用的1%,那么即使是巨大的差异也不会真正影响您的程序


如果你真的想让你的服务器运转起来,我给你的最好建议是,确保你所有的IO都是异步进行的,不要在线程池中运行长时间运行的任务。net4.5 async/await确实简化了所有这些。。。考虑使用它来维护更多的代码。

< P>我已经使用套接字和双向激活消息处理了实时投注系统。使用一个框架来处理像WCF P2P这样的套接字层确实更容易。它为您处理所有连接问题,您可以专注于业务逻辑。

事件调用和回调之间的差异可以忽略不计。回调只是对委托(或函数指针)的调用。在没有某种回调的情况下,您无法执行异步操作并期望得到任何类型的结果

对于事件,它们可以是多播的。这意味着要进行多次回调调用——因为要调用多个方法,所以成本会更高。但是,如果您正在这样做,您可能需要这样做——另一种方法是让多个代理手动调用它们。所以,没有什么真正的好处。事件通常可以包括发送者/事件参数;因此,您有了额外的对象和eventargs实例的创建;但我从未见过这种情况会影响性能

就个人而言,我不使用基于事件的异步模式——我发现(在.NET4.5之前)异步编程模型更普遍。在.NET4.5中,我更喜欢TaskAsynchronous模式(以Async结尾的单个方法,而不是以Begin和end开头的两个方法),因为它们可以与Async/await一起使用,而且不太冗长

现在,如果问题是
新建异步回调(Async\u Send\u Receive.Read\u Callback)
之间的区别,例如:

s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     new AsyncCallback(Async_Send_Receive.Read_Callback), so);
s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     Async_Send_Receive.Read_Callback, so);
只需
Async\u Send\u Receive.Read\u Callback
,例如:

s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     new AsyncCallback(Async_Send_Receive.Read_Callback), so);
s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     Async_Send_Receive.Read_Callback, so);
第二只不过是第一只手的简写;
AsyncCallback
委托仍在幕后创建


但是,就像大多数事情一样;即使人们普遍认为在性能、测试和测量方面没有明显差异。如果一种方法比另一种方法有更多的好处(包括性能),请使用该方法。

感谢您迄今为止的建议。我的服务是100%异步处理,但在begin-accept方法中不使用等待句柄。我使用回调开始下一个begin accept。顺便说一句:我更考虑为每个套接字注册10000+x4个委托的内存。其中可能只有4个静态方法,将指针传递到每个套接字进行处理。我还制作了自己的缓冲处理器,以避免连接\构建多个字节[]数组进行传输。我的测试表明,在1000000循环中构建一个20字节的数据包,效率是使用IEnumerable和LINQ加入字节数组的3-4倍。你是说匿名方法(例如lambda)?没有代表你不能回电话。我不确定告诉你真相。在System.Net.Sockets.Socket命名空间中,我对所有操作都使用以Begin开头的异步方法。方法本身接受一个委托参数,该参数在操作完成时调用。在大多数情况下,当完成时触发委托时,服务会将流分解为消息并调用事件来触发消息处理。@mathewdunn我不太确定您的问题是什么;但我试图回答我认为可能是什么。我已经为这个项目调查了WFC。不幸的是,它不能满足我的一些要求,也不能解决我的问题(:(太糟糕了。祝你好运。你好,彼得,很好的建议。正是我要找的。谢谢。你有到.NET 4.5中新的异步功能的好链接吗?使用异步/等待任务异步模式和4.5中异步内容的加载。)