了解C#中的异步(插座)



我对异步方法的实现有些困惑。查找如何使服务器接受多个连接时,我遇到了它。在查找Aync在C#中所做的事情时,让我感到困惑的是,从我可以说出的不是它自己的线程中。但是,它还允许您避免锁定和失速。例如,如果我有以下内容:

    ConnectionManager()
    {
        listener = new TcpListener(port);
        listener.BeginAcceptSocket(new AsyncCallback(acceptConnection), listener);
    }
    public void acceptConnection(IAsyncResult ar)
    {
        //Do stuff
    }

这是否意味着一旦找到连接,它就会执行"接受"函数,但然后继续通过呼叫者函数执行?(在这种情况下,出现在范围内)。这如何允许我创建能够吸引多个客户端的服务器应用程序?即使我在管理服务器/客户端交互之前,我还是使用了线程,我也是这个概念的新手。如果我有点模糊,请告诉我。我在MSDN上查找了多个示例,但仍然有些困惑。提前感谢您!

找到连接后,它将执行" AcceptConnection"函数

然后继续通过呼叫者函数执行?

no。

异步方法实现了什么

正确完成时,它允许使用更少的资源来处理更高数量的请求/秒。

想象您正在创建一台应接受10个TCP端口连接的服务器。

在阻止API的情况下,您必须创建10个线程,仅用于接受插座。线程是昂贵的系统资源,例如每个线程都有自己的堆栈,在线程之间切换需要大量时间。如果客户端连接到某个插座,则操作系统必须唤醒相应的线程。

使用异步API,您发布了10个异步请求。客户端连接时,您的AcceptConnection方法将由CLR线程池的线程调用。

还有一件事。

如果要在等待异步I/O操作完成后继续执行呼叫者功能,则应考虑新C#的异步/等待语法,它允许您做到这一点。该功能可作为Visual Studio 2010的独立库" Async CTP"提供,并包括在Visual Studio 2012中。

我不自称是C#或插座大师,但是据我了解,您上面所获得的代码将接受第一个连接,然后再也没有。您需要建立另一个开始。

类似:

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);
}

因此,通过使用ASYNC接收数据,除了异步连接之外,Accept Connection可以很快完成并设置了侦听新连接。我想您也可以重新订购。

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

(connectedClient是我自己的一类,可以处理接收&传输功能并拥有有关连接的其他信息)。

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
        }
    }

我希望这回答了您要寻找的内容?

最新更新