30

BeginConnect和 和有什么不一样ConnectAsync?随后,BeginDisconnect和 和有什么不一样DisconnectAsync

ConnectAsync文档指出:

“开始对远程主机连接的异步请求。”

BeginConnect文档指出:

“开始对远程主机连接的异步请求。”

theDisconnectAsyncBeginDisconnect也说明了同样的事情:

“开始一个异步请求以断开与远程端点的连接。”

这些方法对之间有什么区别,应该使用哪一个?

4

2 回答 2

14

Socket.ConnectAsync 提供 SocketAsyncEventArgs 作为参数,与 BeginConnect 提供的 3 个参数相比,该参数包含更多信息。另外我知道 ConnectAsync 比 BeginConnect 晚引入,并解决了一些与超时相关的问题(现在不记得这个讨论的来源了)。尽可能首选 ConnectAsync(尽管它需要最低 .NET 2.0 SP1)。

ConnectAsync 有一个关于回调的问题。如果这值得关注,这里是关于它的讨论:使用 System.Net.Sockets.Socket.AcceptAsync 模型AsyncCallBack CompletedSynchronously时的堆栈溢出

Silverlight 中不支持 BeginConnect 方法(仅支持 ConnectAsync),因此如果您打算开发客户端 Silverlight 应用程序,这可能是另一个问题。

两种方法中使用的模式也不同。以下是讨论:Begin* 和 *Async 用于 .NET 中的套接字是否有任何性能差异?

于 2011-04-23T15:21:33.120 回答
12

引入 XXXXAsync 方法是因为它们减少了当服务器有许多连接的客户端时发生的内存抖动量。与文档中描述的池相结合,与旧的 BeginXXX API 相比,使用此 API 大大减少了 GC 必须执行的工作量。

文档说以下内容:

这些增强的主要特点是避免在大容量异步套接字 I/O 期间重复分配和同步对象。目前由 System.Net.Sockets.Socket 类实现的 Begin/End 设计模式要求为每个异步套接字操作分配一个 System.IAsyncResult 对象。

因此,除非您正在为成千上万个连接的客户端编写服务器,否则我不会为 XXXXAsync 烦恼。API 实现起来相当困难,除了企业级服务之外几乎没有什么收获。

于 2011-04-23T15:34:16.233 回答