我对异步方法的实现有些困惑。查找如何使服务器接受多个连接时,我遇到了它。在查找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
}
}
我希望这回答了您要寻找的内容?