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