2012-06-07 23 views
0

我只是寫一個聊天應用程序(服務器)和我有一個問題。如何正確地將實例引用傳遞給另一個類的構造函數?

服務器接受TcpClient中的連接,然後創建Connection類的新實例,並將TcpClient的引用傳遞給它。這個新的Connection實例保存了未來使用的參考。然後將新的Connection實例添加到Users列表中。

讓我們來看看僞代碼:

while(true) 
{ 
    // 1. Accept connection into new Client instance 
    Client = new TcpClient() 
    Client = AcceptTcpClient(); 
    // 2. Create new Connection object and pass Client's reference to it. 
    Connection abc = new Connection(Client); 

    // Add new user to users collection 
    Users.Add(Connection); 
} 

現在abc實例具有參考客戶對象。在此之前,它一切正常,但每次while()循環進入下一次迭代時,我都可以在調試器中看到Client實例已被丟棄(通過垃圾回收器,我想)。

因此,當另一個迭代開始時,Users列表中的所有Connection實例都可以,但是它們對TcpClient的引用僅指回收的實例。因此,連接立即關閉,無法完成工作。

你知道問題出在哪裏?感謝您的答案。

您可能需要確切的源代碼 - 如果是的話,我可以提供它,當然。

+4

哪個客戶端被設置?你隱式創建2:第一個是「new TcpClient()」,第二個是由「AcceptTcpClient」返回的,最終會導致第一個被拋棄。 – Joe

+0

它回收AcceptTcpClient對象。第一個「空白」對象「消失」,就像我在下面一行中調用AcceptTcpClient()一樣快。如果我理解的很好,不需要Client = new TcpClient(),好嗎?但是,我試圖刪除它,但它沒有解決問題。 –

+0

「對象引用」與「對象指針」相比,問題在於garbarge收集器「決定」何時處置每個對象,而不是「當程序員忘記它時處理對象」 – umlcat

回答

1

它不是一個單一的連接。

有兩件事情在這裏重疊。

「連接」取決於客戶端,將被創建,並且您正在創建多個客戶端以及多個相應的連接。

你可以欺騙一點,垃圾收集器,通過使用空引用,並聲明變量,外循環:

public void Dummy(ref Connection AConnection, ref TcpClient AClient) 
{ 
    AConnection = null; 
    AClient = null; 
} // void Dummy(...) 

public void Example() 
{ 
    TcpClient Client = null; 
    Connection abc = null; 

    while(true) 
    { 
     // 1. create new Client instance, WITHOUT connection 
     Client = new TcpClient() 
     //Client = AcceptTcpClient(); 

     // 2. Create new Connection object that requires Client's reference to it. 
     Connection abc = new Connection(Client); 

     // Add new user to users collection 
     Users.Add(abc); 

     // uncomment only when debugging 
     Dummy(ref abc, ref Client) 
    } // while 

    // uncomment only when debugging 
    Client = null; 
    abc = null; 
} // void Example(...) 

乾杯。

相關問題