我对异步方法的实现有点困惑。我在查找如何使服务器接受多个连接时遇到了它。在查找 Aync 在 C# 中的具体功能时,令我困惑的是,据我所知,它不是自己的线程。但是,它还可以让您避免锁定和停顿。例如,如果我有以下内容:
ConnectionManager()
{
listener = new TcpListener(port);
listener.BeginAcceptSocket(new AsyncCallback(acceptConnection), listener);
}
public void acceptConnection(IAsyncResult ar)
{
//Do stuff
}
这是否意味着一旦找到连接,它就会执行“acceptConnection”函数,然后继续通过调用者函数执行? (在这种情况下超出了范围)。这如何让我创建一个能够支持多个客户端的服务器应用程序?尽管我之前曾使用线程来管理服务器/客户端交互,但我对这个概念还相当陌生。如果我有点含糊,请告诉我。我在 MSDN 上查找了多个示例,但仍然有点困惑。提前谢谢您!
最佳答案
as soon as it finds a connection, it executes the "acceptConnection" function
是的
then continues to execute through the caller function?
没有。
what does the Async approach achieve
如果做得正确,它可以使用更少的资源每秒处理更多的请求。
假设您正在创建一个服务器,该服务器应该接受 10 个 TCP 端口上的连接。
使用阻塞 API,您必须创建 10 个线程才能接受套接字。线程是昂贵的系统资源,例如每个线程都有自己的堆栈,线程之间的切换需要相当长的时间。如果客户端连接到某个套接字,操作系统将不得不唤醒相应的线程。
使用异步 API,您可以发布 10 个异步请求。当客户端连接时,您的acceptConnection方法将由CLR线程池中的线程调用。
还有一件事。
如果你想在等待异步 I/O 操作完成后继续执行调用函数,你应该考虑新的 C# 的 async/await 语法,它允许你做到这一点。该功能可作为 Visual Studio 2010 的独立库“异步 CTP”使用,并包含在 Visual Studio 2012 中。
关于c# - 了解 C# 中的异步(套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13300053/