2013-08-05 92 views
2

關閉它好了好了,這裏是代碼:線程循環,以最佳的方式

private void Receivev2() 
    { 
     try 
     { 
      using (UdpClient udpclient = new UdpClient(1500)) 
      { 
       while (connect == true) 
       { 

        byte[] byteData = udpclient.Receive(ref remoteEP); 
        waveProvider.AddSamples(byteData, 0, byteData.Length); 
        if (Record == true) 
        { 
         waveWriter.Write(byteData, 0, byteData.Length); 
        } 

       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "VoiceChat-Receive()", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

It's上線,和幸福,從UDP接收數據並播放,沒什麼奇怪的。

然而,我的問題是讓它正常停止,或者好,不知道如何放置它。

但讓我們說,我開始線程,它循環。 然後,如果我關閉我的應用程序,應用程序不會「關閉」,因爲線程不會關閉。

現在要解決這個問題,我使用IsBackground = true。

但我不確定這是否是一個最佳的方式來做到這一點,它感覺就像強迫它關閉,像ProcessKill或其他東西。

也許這是正確的方式,我不知道。

請給我這方面的意見。

+0

你是否有正在運行和玩的線程的句柄?如果是,請調用thread.abort方法。如果不保持手柄並使用它來關閉自身。 – Ehsan

+0

您正在關閉應用程序。你設置'IsBackground = true',應用程序關閉,好嗎?如果是這樣,你想要多少最佳? –

回答

2

訣竅是打電話UdpClient.Close。這將取消任何待處理的操作,並且如果Receive方法阻塞,則將其「戳」到投擲SocketException。很明顯,你將不得不從另一個線程調用Close,這意味着你需要重構一下你的代碼,以便udpclient不再是局部變量。您還需要將connect設置爲false,以便循環結束。

所以總結的步驟如下。

  • 致電Close阻止Receive阻止。
  • connect設置爲false。
  • 重構代碼以使上述可能。
+0

我之前已經這樣做了,但正如你所說,我得到一個SocketException「WSACancelBlockingCall」,以及,我不想要例外; S – Zerowalker

+0

或者我應該把異常看作是「OK」並且像這樣做: catch (異常ex) { if(ex是SocketException) { return; MessageBox.Show(ex.Message,「VoiceChat-Receive()」,MessageBoxButtons.OK,MessageBoxIcon.Error); } – Zerowalker

+0

@ user2587718:異常是好的。這就是其他人正在處理這種情況的方式。所以是的,趕上例外。 –

0

如果它是一個進口線程,你最好不要設置的IsBackground,因爲主線程停止,它會被強制停止

停止螺距:

1套連接= false時,不是主線程睡會兒,直到它停止 2線程是否還活着,你可以放棄它,這一步是沒有必要 3比加入回線程主線程

就像這樣:

 connect= false; 

     Thread.Sleep(200); 
     if (thread1 != null) 
     { 
      if (thread1 .IsAlive) 
      { 
       thread1 .Abort(); 
       thread1 .Join(); 
      } 
     } 
+0

'因爲主線程停止,它將被強制停止' - 這是怎麼回事? –

相關問題