簡體   English   中英

混合同步和異步套接字調用

[英]Mixing synchronous and asynchronous socket calls

在同一服務器上組合同步和異步套接字調用是否被視為不良做法? 例如(從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
}

嗯...好多了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM