0

C# 有几个用于网络任务的有用类,例如 TcpClient 和 WebClient。两者都有 BeginX 方法(分别为 BeginConnect 和 BeginGetResponse),根据 MSDN,应该始终跟随 EndX。两者都接受操作完成后调用的委托。

但是,假设我们无法建立连接,因此调用这些方法会引发异常。我应该仍然调用各自的 EndX 方法,还是应该先检查连接是否建立,然后才调用它们?

或者,在以下示例中,我应该使用 OnSocketConnected1 还是 OnSocketConnected2?

static TcpClient m_client;

private static void OnSocketConnected1 (IAsyncResult asynchronousResult)
{
  try
  {
    m_client.EndConnect(asynchronousResult);
  }
  catch { }
}

private static void OnSocketConnected2(IAsyncResult asynchronousResult)
{
  if (m_client.Connected)
  {
    try
    {
      m_client.EndConnect(asynchronousResult);
    }
    catch { }
  }
}

static void Main(string[] args)
{
  m_client = new TcpClient();
  m_client.BeginConnect("http://www.example.com", 555, OnSocketConnected, null);
  Console.ReadLine();
}

谢谢

4

5 回答 5

3

MSDN 报价,TcpClient.BeginConnect

异步 BeginConnect 操作必须通过调用 EndConnect 方法来完成。通常,该方法由 asyncCallback 委托调用。

我在这里看不到这条规则的例外。而且您的字段应该无关紧要(阅读:版本 1,立即无条件地调用 EndConnect)。

于 2010-01-04T09:34:43.290 回答
0

我的直觉会说是,因为它可能会允许框架对IAsyncResult 对象进行垃圾收集

于 2010-01-04T09:31:56.677 回答
0
private static void OnSocketConnected1 (IAsyncResult asynchronousResult)
{
  try
  {
    m_client.EndConnect(asynchronousResult);
  }
  catch { }
}
于 2010-01-04T09:32:07.300 回答
0

我不认为第二个版本做你认为它做的事情。Socket.Connect 返回有关最新 IO 命令的信息。在 EndConnect 完成之前,您将无法建立连接。

于 2010-10-16T00:15:40.527 回答
0

根据我自己的经验,它看起来socket.EndConnect()socket.Close()无关紧要。如果您未能建立连接,则该socket.Dispose方法(当套接字被破坏时将被调用)似乎无论如何都试图断开连接。当我调用Dispose(),EndConnect()Close(), 或只是将套接字放入一个USING块中时,我会得到相同的行为 - 缓慢断开连接而不是即时响应。事实上,即使我愿意,我也没有找到阻止这种情况发生的方法。

于 2015-08-13T02:04:03.567 回答