2010-01-04 112 views
0

C#为网络任务(如TcpClient和WebClient)提供了几个有用的类。两者都有BeginX方法(分别为BeginConnect和BeginGetResponse),根据MSDN,EndX应始终遵循这些方法。两者都接受操作完成后调用的委托。我是否应该始终调用TcpClient.EndConnect(即使连接失败?)

但是,假设我们未能建立连接,因此调用这些方法会引发异常。我仍然应该调用相应的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(); 
} 

感谢

回答

3

MSDN Quote, TcpClient.BeginConnect

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

我在这里看到这条规则也不例外。你的领域应该不重要(阅读:版本1,立即无条件地调用EndConnect)。

+0

也许这是不正确的。我在调用连接失败的回调函数中的EndConnect()时引发了SocketException。它说(我从中文翻译它,可能不准确):对无法连接的网络执行套接字操作。 – guogangj 2016-01-28 08:22:26

0

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

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

如果连接无法建立,EndConnect仍会抛出异常 – r0u1i 2010-01-04 09:34:46

+1

这对我来说似乎很奇怪。 EndConnect需要做一些有意义的事情。为什么你建议把它作为回调方法中的最后一件事? – 2010-01-04 09:35:50

+0

哈哈,我在那里写了什么?!?将编辑我的帖子... thx的输入 – 2010-01-04 10:08:49

0

我不认为第二个版本会做你认为它的作用。 Socket.Connect返回有关最近IO命令的信息。直到EndConnect完成后才能建立连接。

0

根据我自己的经验,看起来像socket.EndConnect()socket.Close()是无关紧要的。如果您未能建立连接,则socket.Dispose方法(在套接字被销毁时将调用该方法)似乎试图断开连接。当我打电话给Dispose()EndConnect()Close(),或者直接将该插座插入USING区块时,我会得到相同的行为 - 缓慢断开而不是立即响应。事实上,即使我想要,我也没有找到一种方法来阻止这种情况的发生。

相关问题