BeginConnect和ConnectAsync有什么区别?

时间:2011-04-23 15:01:02

标签: c# sockets asynchronous connect disconnect

BeginConnectConnectAsync之间有什么区别?随后,BeginDisconnectDisconnectAsync之间有什么区别?

ConnectAsync文档声明:

  

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

BeginConnect文档声明:

  

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

DisconnectAsyncBeginDisconnect也表示同样的事情:

  

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

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

2 个答案:

答案 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 modelAsyncCallBack 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必须执行的工作量。

docs say the following

  

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

因此,除非您为数千个连接的客户端编写服务器,否则我不会打扰XXXXAsync。 API实现起来相当困难,除了企业级服务之外几乎没什么好处。