c# - 混契约(Contract)步和异步套接字调用

标签 c# sockets asynchronous synchronous

在同一服务器上组契约(Contract)步和异步套接字调用是否被认为是不好的做法?例如(从msdn修改):

// Initalize everything up here

while (true) {
     // Set the event to nonsignaled state.
     allDone.Reset();  //allDone is a manual reset event

     // Start an asynchronous socket to listen for connections.
     Console.WriteLine("Waiting for a connection...");
     listener.BeginAccept( 
     new AsyncCallback(AcceptCallback), listener);

      // Wait until a connection is made before continuing.
      allDone.WaitOne();
}

public static void AcceptCallback(IAsyncResult ar) {
    // Signal the main thread to continue.
    allDone.Set();

    // Handle the newly connected socket here, in my case have it
    // start receiving data asynchronously
}

在这种情况下,由于您要等到每个连接都建立好之后才能收听下一个连接,因此似乎这几乎是一个阻塞调用。鉴于它应该更快一点,因为客户端的初始处理将通过不同的线程完成,但是从理论上讲这应该是一个相对较小的开销。

鉴于此,执行以下操作是否被视为不好的做法:
while (true) {
     // Start listening for new socket connections
     Socket client = listener.Accept(); // Blocking call


    // Handle the newly connected socket here, in my case have it
    // start receiving data asynchronously
}

在我看来,此代码比上面的代码简单得多,如果我正确的话,它也应该与上面的代码具有相对接近的性能。

最佳答案

查看您的两个示例,我发现发生的事情几乎没有差异(如果有的话)。我敢说您的第二种形式(直接用于同步调用)会更好,因为它的复杂程度要低得多,并且在行为上是相同的。如果您可以查看Accept的源代码,那么在某些时候(可能是在OS中),它将与更冗长的代码相同。

然而...

快速修改旧代码可以消除所有阻塞,并使所有操作异步发生:

void Accept()
{
    Console.WriteLine("Waiting for a connection...");
    listener.BeginAccept(AcceptCallback, listener);
}
public static void AcceptCallback(IAsyncResult ar) {
            var listener = (Socket)ar.AsyncState;
            //Always call End async method or there will be a memory leak. (HRM)                
            listener.EndAccept(ar); 
    Accept();

    //bla
}

嗯...好多了。

关于c# - 混契约(Contract)步和异步套接字调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4000644/

相关文章:

c# - 以编程方式解析 COM 引用

c# - 同一时刻调用两次的方法

Android Wi-Fi Direct P2P 从服务器向客户端发送数据

javascript - 加密解密后的节点mysql查询

node.js - Node 异步与同步

c# - ASP.NET MVC 中具有多个 View 的 Telerik 样式

c# - 在 C# 中是否有更简洁的 if 语句编写方式?

c# - 如何通过回调等待外部响应?

Java:如何重用SocketChannel

node.js - 如何将 async/await 与 mongoose 一起使用