簡體   English   中英

在線程中使用塊

[英]Using Block with Threading

我對C#有一定的經驗,但是我之前從未遇到過這個問題,我想知道是否有更多經驗豐富的C#開發人員知道在這種情況下該怎么做。 這是所討論方法的代碼:(該問題在代碼塊之后進行了解釋)

public void ConnectToRemoteServer() 
{
    Console.WriteLine("Attempting to connect to " + config.GetString(ConfigParams.MasterServerIp) + ":" + config.GetString(ConfigParams.MasterServerPort));
    TcpClient client = new TcpClient();
    IPEndPoint address = new IPEndPoint(IPAddress.Parse(config.GetString(ConfigParams.MasterServerIp)), config.GetInt(ConfigParams.MasterServerPort));
    Console.WriteLine("Connecting...");
    //Begin asynchronous sever communication
    if (this.autoTask == null)
    {
        communicator = new CommunicationListener(client, config, address);
    }
    else
    {
        communicator = new CommunicationListener(client, config, address, this.autoTask);
    }
    Thread communicationThread = new Thread(new ThreadStart(communicator.Start));
    communicationThread.Start();
}

我想知道的部分是我是否應該在此代碼塊中使用using語句。 我知道TcpClient實現了接口IDisposable ,因此應該封裝在using語句中,但是,在這種情況下,將啟動一個使用TcpClient的新線程,因此using塊的結尾將在TcpClient已完成使用。 那我應該在這里使用using語句嗎?

不要在這里使用using,因為它會由於早期處理而使您的程序無法正常工作。 只需確保將TcpClient正確傳遞給新線程,並確保該線程最終對其進行處理即可。

我認為這將是最好創建TcpClient在子線程,這樣就可以使用using那里。

我認為您在這種情況下應該避免使用using塊,因為在using塊的末尾使用隱式close()的結果。 我認為這是一個比較常見的惡化原因,因為有關何時使用塊的通常建議是“只要對象隱含IDisposable”。

這是有關何時不使用use的權威文章,無論IDisposable的實現如何。 http://msdn.microsoft.com/zh-CN/library/aa355056.aspx

一般的經驗法則是,如果其IDisposposable,則應處置該對象。

using塊為您提供了一種很好的簡便方法,但是由於TCPClient將在該方法之外持久存在,因此在這種情況下無法使用它。

如果您真的想編寫漂亮的代碼,那么應該; 在您的類中聲明您的TCPClient,讓您的類實現IDisposable,在新的Dispose方法中處置您的TCPClient。 (也許可以做一些有關結束線程的事情)。

這樣,您可以將類包裝在using塊中。

我認為這是另一種問題。 您必須在CommunicationListener中實現IDisposable,並在那里也實例化TcpClient,並在CommunicationListener.Dispose實現中部署TcpClient。

什么時候最好配置CommunicationListener? 這取決於。

我將使該方法所在的類和CommunicationListener都成為一次性的。 然后,我將通過在其上設置一個標記來實現一種取消通信偵聽器線程的方法,以便在處理您自己的類時,它不會使其他線程運行。 然后,在“處置父類”中,設置標志,以便CommunicationListener可以停止,處置CommunicationListener,然后再在內部處置TcpClient。

我希望這是有道理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM