C# 混合同步和异步套接字调用
在同一台服务器上组合同步和异步套接字调用是否被认为是不好的做法?例如(根据msdn修改): 在本例中,由于您要等到每个连接完成后再侦听下一个连接,因此这看起来几乎是一个阻塞调用。由于客户端的初始处理将在不同的线程中完成,因此它应该快一点,但理论上这应该是一个相对较小的开销 考虑到这一点,这样做是否会被视为不好的做法:C# 混合同步和异步套接字调用,c#,sockets,asynchronous,synchronous,C#,Sockets,Asynchronous,Synchronous,在同一台服务器上组合同步和异步套接字调用是否被认为是不好的做法?例如(根据msdn修改): 在本例中,由于您要等到每个连接完成后再侦听下一个连接,因此这看起来几乎是一个阻塞调用。由于客户端的初始处理将在不同的线程中完成,因此它应该快一点,但理论上这应该是一个相对较小的开销 考虑到这一点,这样做是否会被视为不好的做法: while (true) { // Start listening for new socket connections Socket client = lis
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的源代码,那么在某个时候(可能是在操作系统中),它将与您的更详细的代码执行相同的操作 然而 对旧代码进行非常快速的修改可以消除所有阻塞,并让所有事情异步发生:
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
}
嗯。。。好多了
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
}