[英]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.