【发布时间】:2014-06-22 21:57:13
【问题描述】:
我有一个问题,在套接字上的 BeginAccept 之后的什么时候我可以告诉我的侦听器线程它可以再次开始接受连接。
这是我的代码:
while(!mStopWaitHandle.WaitOne(0, false)) // <-- Manual Reset event to check if the service has stopped.
{
Logging.Debug("Waiting for a connection...");
socket.BeginAccept(new AsyncCallback(AcceptConnection), socket);
mReadyToAcceptWaitHandle.WaitOne(); // <-- AutoResetEvent to block until I can continue accepting connections
}
然后在我的异步回调中:
private void AcceptConnection(IAsyncResult ar)
{
mReadyToAcceptWaitHandle.Set(); // <-- Tell the listener thread to start accepting connections again
Socket socket = (Socket)ar.AsyncState;
Socket workerSocket = socket.EndAccept(ar);
... handle connection on workerSocket ...
}
这就是他们在Asynchronous Server Socket Example on msdn 中的做法。
但是从我读到的BeginAccept 不是阻塞调用。阻塞调用是EndAccept,它会阻塞直到有连接可以接受。
所以在 EndAccept() 之前让mReadyToAcceptWaitHandle.Set(); 告诉侦听器线程继续接受连接对我来说似乎很奇怪,因为这不会导致它继续打开AcceptConnection 处理程序线程(从我的从执行上看,它似乎没有这样做,但我不知道为什么?)这一切都只是阻止EndAccept?
在EndAccept 之后有mReadyToAcceptWaitHandle.Set(); 不是更好吗,这样它一次只处理接受一个连接,一旦它接受,但在它实际处理连接上的通信之前。
这两种方法似乎都有效,但我想知道哪一种是正确的方法,以及一种方法是否会产生另一种没有的微妙负面影响。
我在这里错过了什么?
提前致谢。
【问题讨论】:
标签: c# .net asyncsocket