我應該還是叫我的插座Dispose()
後關閉它?關閉後我應該手動處理插座嗎?
例如:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
我不知道,因爲the MSDN documentation說以下內容:
關閉套接字連接並釋放所有相關的資源。
我應該還是叫我的插座Dispose()
後關閉它?關閉後我應該手動處理插座嗎?
例如:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
我不知道,因爲the MSDN documentation說以下內容:
關閉套接字連接並釋放所有相關的資源。
調用Close內部調用Dispose,所以你並不需要同時調用。從.NET Reflector:
public void Close()
{
if (s_LoggingEnabled)
{
Logging.Enter(Logging.Sockets, this, "Close", (string) null);
}
((IDisposable)this).Dispose();
if (s_LoggingEnabled)
{
Logging.Exit(Logging.Sockets, this, "Close", (string) null);
}
}
如果可能的話,你應該使用using
模式,讓你總是調用Dispose無論任何可能發生的異常。
按照慣例,你應該總是調用Dispose任何實現IDisposable。除了顯而易見的事情之外,你永遠不知道它可能做了什麼。
如果你碰巧使用反射地看到,事實上,它目前是不需要的,你不應該假設內部實現可能在某一時刻發生變化。
它從來沒有傷害調用處置。只要做到這一點:)
它不會傷害調用Dispose,但你不需要如果你'重新使用「使用」結構;它會自動完成。 「using」構造實際上編譯爲「try ... finally」,Dispose在「finally」中調用。 – Andy 2010-08-30 15:06:44
你是對的。我沒有拼出來,但「使用結構」=調用Dispose。只要Dispose被調用。在列出的具體情況中,通常很難將「使用構造」與套接字一起使用,因爲它們不是在單個方法調用中構造,使用和處理的。套接字通常比單一方法壽命更長,因此必須直接調用Dispose。 – 2010-08-30 16:17:51
關閉和處置在這種情況下是相同的。當Ms在.Net 1中引入Dispose模式時,Dispose字不易被發現。因此,準則是添加特定於上下文的關鍵字,這些關鍵字將執行相同的功能,並且更容易被用戶發現。像關閉文件和套接字一樣。
它通常被視爲許多最佳實踐關閉IDisposable的對象,因爲它使代碼更清晰。但是,如果您在使用語句中封裝了IDisposable的用法,則顯式調用Dispose會自動完成,如this page所述。
讓.NET調用配置:
using (Socket mySocket = new Socket(...)) {
// Do stuff with socket, then bring it down nicely
} // Dispose gets called returning the unmanaged system resources
問題不在於使用什麼,而在於調用.Close()後調用.Dispose()(不管是否顯式調用Dispose)。 – 2014-02-13 22:58:53
你是對的。文檔不清楚,因爲在dispose方法中,應該調用Dispose()來清理套接字非託管資源,但另一方面,Close應該也這樣做。我想那個關閉呼叫處置或相反。文件支持同樣的行爲,所以這是一個有教養的猜測。
對於某些類型的對象,'Close'可能會保留一些資源,以允許重新打開對象;對於其他類型,「Close」沒有理由保留任何資源。無論哪種情況,由於在「關閉」之後調用'IDisposable.Dispose'應該沒有什麼壞處,這樣做將確保與兩種對象的兼容性。 – supercat 2014-02-10 16:37:03
thnx爲dasm,但這很奇怪。 MSDN說Close()是放棄異步操作(如BeginReceive())的一種很好且合法的方法,然後EndReceive將返回「對象處置」錯誤。任何想法應該如何工作? – 2011-01-11 20:38:15
http://stackoverflow.com/questions/4662553/how-to-abort-sockets-beginreceive/4662631#4662631 – 2011-01-11 22:35:20
你可以說關於IP不可達的問題嗎? @Mark Byers https://stackoverflow.com/questions/44694061/udpclient-unreachable-ip-connection-time-with-using-blocks – 2017-06-23 13:38:30