async Task AcceptAsync(Socket socket)
{
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += (s, a) => ((TaskCompletionSource<Socket>)a.UserToken).Complete(a, b => b.AcceptSocket);
while (!this.closed)
{
try
{
args.AcceptSocket = null;
Socket acceptSocket = await socket.AcceptAsync(args, SocketFlags.None);
var task = this.HandleSocketAsync(acceptSocket);
}
catch (ObjectDisposedException)
{
// listener is closed
}
catch (Exception exception)
{
Trace.WriteLine(TraceLevel.Warning, exception.ToString());
}
}
args.Dispose();
socket.Dispose();
}
}