【问题标题】:Mixing synchronous and asynchronous socket calls混合同步和异步套接字调用
【发布时间】:2010-10-22 20:18:52
【问题描述】:

在同一台服务器上结合同步和异步套接字调用是否被认为是不好的做法?例如(修改自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
}

在我看来,这段代码比上面的代码要简单得多,如果我没记错的话,性能也应该与上面的代码比较接近。

【问题讨论】:

    标签: c# sockets asynchronous synchronous


    【解决方案1】:

    看看你的两个例子,我发现发生的事情几乎没有区别(如果有的话)。我敢说你的第二种形式(直接进行同步调用)更好,因为它不那么复杂并且在行为上是相同的。如果您可以查看 Accept 的源代码,在某些时候(可能在操作系统中),它的作用与您的更冗长的代码大致相同。

    不过……

    对旧代码的快速修改消除了所有阻塞并让一切异步发生:

    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
    }
    

    嗯……好多了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多