C# 理解C中的异步(套接字)#

C# 理解C中的异步(套接字)#,c#,asynchronous,C#,Asynchronous,对于异步方法实现了什么,我有点困惑。我在查找如何使服务器接受多个连接时遇到了这个问题。在查找Aync在C#中的具体操作时,让我困惑的是,从我可以看出它不是自己的线程。但是,它也允许您避免锁定和暂停。例如,如果我有以下内容: ConnectionManager() { listener = new TcpListener(port); listener.BeginAcceptSocket(new AsyncCallback(acceptConnect

对于异步方法实现了什么,我有点困惑。我在查找如何使服务器接受多个连接时遇到了这个问题。在查找Aync在C#中的具体操作时,让我困惑的是,从我可以看出它不是自己的线程。但是,它也允许您避免锁定和暂停。例如,如果我有以下内容:

    ConnectionManager()
    {
        listener = new TcpListener(port);
        listener.BeginAcceptSocket(new AsyncCallback(acceptConnection), listener);
    }

    public void acceptConnection(IAsyncResult ar)
    {
        //Do stuff
    }
这是否意味着一旦找到连接,它就会执行“acceptConnection”函数,但随后会通过调用方函数继续执行?(在这种情况下,超出范围)。这如何允许我创建一个能够接受多个客户端的服务器应用程序?我对这个概念还相当陌生,尽管我以前使用过线程来管理服务器/客户机交互。如果我有点含糊不清,请告诉我。我查阅了MSDN上的多个示例,仍然有点困惑。提前谢谢你

我并不自称是c#或sockets大师,但据我所知,您上面的代码将接受第一次连接,然后不再接受。你需要建立另一个BeginAccept

比如:

TcpListener listener = null;

ConnectionManager()
{
    listener = new TcpListener(port);
    listener.BeginAcceptSocket(new AsyncCallback(acceptConnection), listener);
}

public void acceptConnection(IAsyncResult ar)
{
    // Create async receive data code..

    // Get ready for a new connection
    listener.BeginAcceptSocket(new AsyncCallback(acceptConnection), listener);

}
因此,通过在异步连接之外使用异步接收数据,accept连接可以很快完成,并设置新连接的侦听。我想你也可以再点这个

对于直插座连接(不是TcpListener),我使用的是:

(connectedClient是我自己的类,它处理接收和传输函数,并保存有关连接的其他信息)

我希望这能回答你的问题

一旦找到连接,它就会执行“acceptConnection”函数

然后通过调用者函数继续执行

没有

异步方法实现了什么

如果操作正确,它允许每秒使用更少的资源处理更多的请求

假设您正在创建一个服务器,该服务器应接受10个TCP端口上的连接

使用阻塞API,您必须创建10个线程来接受套接字。线程是昂贵的系统资源,例如,每个线程都有自己的堆栈,在线程之间切换需要相当长的时间。如果客户端连接到某个套接字,操作系统将不得不唤醒相应的线程

使用异步API,可以发布10个异步请求。客户端连接时,CLR线程池中的线程将调用acceptConnection方法

还有一件事


如果您希望在等待异步I/O操作完成之后继续执行调用方函数,则应该考虑新的C.C的异步/等待语法,它允许您这样做。该功能作为visual studio 2010的独立库“Async CTP”提供,并包含在visual studio 2012中。

我喜欢您对连接使用事件处理的方式。我可能会遵循这个模型:)。这很有帮助,谢谢!我不认为推荐Async CTP是个好主意,那只是预览代码。@svick,它工作得很好,而且自从SP1 refresh以来,它有一个上线许可证,所以它不仅仅是“预览代码”。我在Windows 8应用程序中实现HTTP客户端时看到过这段代码。然而,他们调用的大多数示例代码都在等待,这迫使您等待该函数超出范围或返回某些内容,然后再继续。@Soons CTP的意思是“社区技术预览”,所以,是的,它只是预览代码,甚至不是测试版。仅仅因为许可证允许你做一些事情并不意味着这是一个好主意。@svick我不关心营销。目前,该技术稳定可靠。
int Port = 7777; // or whatever port you want to listen on
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, port);
listenSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

listenSocket.Bind(ipLocal);

// create the call back for any client connections...
        listenSocket.BeginAccept(new AsyncCallback(OnClientConnection), null);

private void OnClientConnection(IAsyncResult asyn)
    {
        if (socketClosed)
        {
            return;
        }

        try
        {
            Socket clientSocket = listenSocket.EndAccept(asyn);

            ConnectedClient connectedClient = new ConnectedClient(clientSocket, this);

            connectedClient.MessageReceived += OnMessageReceived;
            connectedClient.Disconnected += OnDisconnection;
            connectedClient.MessageSent += OnMessageSent;

            connectedClient.StartListening();

            // create the call back for any client connections...
            listenSocket.BeginAccept(new AsyncCallback(OnClientConnection), null);

        }
        catch (ObjectDisposedException excpt)
        {
            // Deal with this, your code goes here

        }
        catch (Exception excpt)
        {
            // Deal with this, your code goes here
        }

    }