2011-04-02 32 views
1

在以下線程中,UDP數據包將從客戶端讀取,直到布爾字段Run被設置爲false。C#處理線程和阻塞套接字

如果在Receive方法被阻塞時Run被設置爲false,它將永遠保持阻塞狀態(除非客戶端發送數據,這將使線程循環並再次檢查Run條件)。

while (Run) 
{ 
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method 

    // process received data 
} 

我通常通過在服務器上設置超時來解決問題。它工作正常,但對我來說似乎是一個零星的解決方案。

udpClient.Client.ReceiveTimeout = 5000; 

while (Run) 
{ 
    try 
    { 
     IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); 
     byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method 

     // process received data 
    } 
    catch(SocketException ex) {} // timeout reached 
} 

你會如何處理這個問題?有沒有更好的方法?

回答

5

使用UdpClient.Close()。這將終止阻塞的Receive()調用。準備捕獲ObjectDisposedException,它會向您的線程表明套接字已關閉。

1

你可以做這樣的事情:

private bool run; 
public bool Run 
{ 
    get 
    { 
     return run; 
    } 

    set 
    { 
     run = value; 
     if(!run) 
     { 
      udpClient.Close(); 
     } 

    } 
} 

這允許你關閉任何一次滿足條件,停止從聽你的連接的客戶端。可能會拋出異常,但我不相信它會是SocketTimeoutException,因此您需要處理該異常。

+0

只需在您致電關閉前致電斷開連接,它不會引發異常。 – zezba9000 2014-08-24 06:42:32