BeginConnect
和ConnectAsync
之间有什么区别?随后,BeginDisconnect
和DisconnectAsync
之间有什么区别?
ConnectAsync
文档声明:
“开始远程主机连接的异步请求。”
BeginConnect
文档也声明:
“开始远程主机连接的异步请求。”
DisconnectAsync
和BeginDisconnect
也表示同样的事情:
“开始异步请求以断开与远程端点的连接。”
这些方法对之间有什么区别?应该使用哪一种方法?
答案 0 :(得分:14)
Socket.ConnectAsync提供SocketAsyncEventArgs作为参数,与BeginConnect提供的3个参数相比,它包含更多信息。另外我知道ConnectAsync比BeginConnect晚推出并解决了与超时相关的一些问题(现在不记得这个讨论的来源)。在可能的情况下首选ConnectAsync(尽管它需要min .NET 2.0 SP1)。
ConnectAsync有一个关于回调的问题。如果这是值得关注的问题,请参阅以下讨论:Stack overflow when using the System.Net.Sockets.Socket.AcceptAsync model和AsyncCallBack CompletedSynchronously
Silverlight中不支持BeginConnect方法(仅支持ConnectAsync),因此如果您打算开发客户端Silverlight应用程序,这可能是另一个问题。
两种方法中使用的模式也不同。以下是讨论:Is there any performance difference between Begin* and *Async for sockets in .NET?
答案 1 :(得分:11)
引入了XXXXAsync方法,因为它们可以减少服务器许多连接的客户端时发生的内存抖动。与pooling described in the docs结合使用,与旧的BeginXXX API相比,使用此API可显着减少GC必须执行的工作量。
这些增强功能的主要功能是避免在高容量异步套接字I / O期间重复分配和同步对象。当前由System.Net.Sockets.Socket类实现的Begin / End设计模式需要为每个异步套接字操作分配System.IAsyncResult对象。
因此,除非您为数千个连接的客户端编写服务器,否则我不会打扰XXXXAsync。 API实现起来相当困难,除了企业级服务之外几乎没什么好处。