【发布时间】:2015-05-16 04:07:26
【问题描述】:
我有一个程序通过侦听连接开始。我想实现一种模式,在这种模式下,服务器将接受一个连接,将该单独的连接传递给用户类进行处理:未来的数据包接收和数据处理。
在我发现异步使用 Socket 类并不可怕之前,我遇到了同步模式的麻烦。但后来我遇到了更多的麻烦。看起来,在while (true) 循环中,由于BeginAccept() 是异步的,程序会不断地通过这个循环并最终遇到OutOfMemoryException。我需要一些东西来监听连接,并立即将该连接的责任移交给其他班级。
所以我阅读了微软的例子,发现了ManualResetEvent。我实际上可以指定何时准备好让循环再次开始收听!但是在阅读了关于 Stack Overflow 的一些问题后,我变得很困惑。
我担心的是,即使我已经异步接受了一个连接,整个程序在重新进入循环时尝试侦听新连接时会阻塞。如果我要处理多个用户,这并不理想。
我对异步 I/O 的世界非常陌生,所以即使是最愤怒的 cmets 对我的词汇或短语的误用我都会感激不尽。
代码:
static void Main(string[] args)
{
MainSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
MainSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.74"), 1626));
MainSocket.Listen(10);
while (true)
{
Ready.Reset();
AcceptCallback = new AsyncCallback(ConnectionAccepted);
MainSocket.BeginAccept(AcceptCallback, MainSocket);
Ready.WaitOne();
}
}
static void ConnectionAccepted(IAsyncResult IAr)
{
Ready.Set();
Connection UserConnection = new Connection(MainSocket.EndAccept(IAr));
}
【问题讨论】:
标签: c# multithreading sockets asynchronous manualresetevent