2010-01-04 107 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區塊時,我會得到相同的行爲 - 緩慢斷開而不是立即響應。事實上,即使我想要,我也沒有找到一種方法來阻止這種情況的發生。

相關問題