在同一台服务器上组合同步和异步套接字调用是否被视为不良做法?例如(从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
}
在我看来,这段代码比上面的代码简单得多,如果我是正确的,那么上述代码也应该具有相对接近的性能。
答案 0 :(得分:3)
看看你的两个例子,我发现正在发生的事情差别很小(如果有的话)。我冒昧地说你的第二种形式(直接进行同步调用)更好,因为它复杂得多且行为相同。如果您可以查看Accept的源代码,在某些时候(可能在操作系统中),它将与更详细的代码完全相同。
...然而
对旧代码的一个非常快速的mod消除了所有阻塞并让所有内容异步发生:
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
}