c# - 了解 C# 中的异步(套接字)

标签 c# asynchronous

我对异步方法的实现有点困惑。我在查找如何使服务器接受多个连接时遇到了它。在查找 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/

相关文章:

angularjs - 加载 Angular 模块时如何异步加载数据?

cocoa-touch - 在 iOS 中淡入异步加载的图像

c# - 从 C# 获取数据到 Excel 03/07

c# - 在 Blazor 中导航页面

c# - 使用存储在变量中的值更新数据库

c# - Take/TryTake 和 Add/TryAdd 在阻塞集合上的区别

javascript - 在使用 Promise.all() forEach 渲染 NodeJS 页面之前等待 Firebase 数据加载

c# - 在 ViewModel 中通过代码设置 ValidationError

c# - WCF 调试记录敏感信息

java - 使用阻塞 API 时的 Java 异步编程