2012-08-06 35 views
1

我正在開發客戶端 - 服務器程序。我使用C#編程語言和.net framework 4.在那裏,每當新客戶端連接到服務器時,服務器將創建新線程來處理每個客戶端。如果其中一個客戶端斷開連接,那麼控制這個斷開連接的客戶端的線程也將被停止(終止)。我不知道如何在多個線程中停止這個特定的線程。我的程序的僞代碼將是這樣的:如何停止多線程中的特定線程並銷燬在特定線程中創建的所有變量和對象

服務器端程序:

Thread t; 
private void form1_load(object sender, EventArgs e) 
{ 
    startserver(); 
} 

void startserver() 
{ 
    t = new Thread(waitclientconnection); 
    t.start(); 
} 

void waitclientconnection() 
{ 
    //namedpipeserverconnection code 
    //waitforclientconnection 

    if (clientOne is connected) 
    {  
     startserver(); //create new thread to wait connection for next client 
    } 

    //object and variable that created within the thread 
    Clientprofile cp = new Clientprofile(); 
    String clientstate = "...."; 

    if (clientOne sends "close" message) 
    { 
    //the thread that controls ClientOne will be killed <-- This is the point that I would like to solve 
    } 
} 

我承認,該方案是一個有點複雜,但目前我只有這種方式來實現我的計劃。我發現一些解決方案建議聲明布爾變量來控制線程停止或在循環時使用。但在我的程序中,這種方式可以停止整個線程,並且無法爲新連接的客戶端創建新線程。此外,我還想知道當這個線程停止時,在每個特定線程中創建的變量和對象是否也可以從內存中被銷燬。想象一下,如果在一個小時內連接了幾百個客戶端,目前只有10個客戶端連接在一起。我只想僅保留這10個客戶端的對象和變量。這個問題很複雜,但我相信你們所有人都能解決並提出任何建議。真的希望你的建議...

回答

1

接收關閉消息的線程是應該被「殺死」的線程,對吧?

所以只要確保代碼停止並正常返回。
不要致電Thread.Abort()或任何東西,這會弄得一團糟。

void waitclientconnection() 
{ 
    if (clientOne is connected) 
    {  
     startserver(); //create new thread to wait connection for next client 
    } 

    while (keepGoing) 
    { 
     ... 

     if (clientOne sends "close" message) 
     { 
      keepGoing = false; 
     } 
    } 
} 
+0

真的很有幫助...謝謝你......但它還有一個問題「可以將對象和變量從內存中一次性銷燬」這個線程被終止了......再次感謝 – 2012-08-06 14:09:59

+0

對象將被「銷燬內存「,只要垃圾收集器不在其他地方引用,垃圾收集器會根據需要自動創建內存。 [請參閱垃圾回收(MSDN)](http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx) – 2012-08-06 14:17:01

+0

不,內存不能一次清除。但這不是問題。資源應該在'using(){}'塊中管理。 – 2012-08-06 14:17:13

1

嘗試重構你的代碼,你有一個監聽線程的滋生關閉客戶端線程時,它得到的連接。當時間合適時,每個客戶端線程都應該能夠自行結束。此外,您應該將客戶端線程的IsBackground屬性設置爲true,這樣它們不會阻止服務器退出。

你現在這樣做的方式可能也是可行的,但似乎比必要的更復雜。

+0

thx爲你的建議 – 2012-08-06 14:17:46