2013-03-24 77 views
0

我試圖阻止我正在上BackgroundWorker;這裏運行UDP監聽器是我的代碼:BackgroundWorker的C#端口聽者

private void bw_DoWork(object senderx, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = senderx as BackgroundWorker; 

     while(true) 
     { 
      Debug.WriteLine("run"); 
      if ((worker.CancellationPending == true)) 
      { 
       Debug.WriteLine("cancel pending"); 
       e.Cancel = true; 
       newsock.Close(); 
       serverStatus = false; 
       break; 
      } 
      else 
      { 
       try 
       { 
        Debug.WriteLine("waiting for reponse.."); 
        data = newsock.Receive(ref sender); 
        (STUCK HERE IF NO RESPONSE) 

所以基本上,如果我沒有得到一個UDP響應,它會被卡在接收循環,並且不會檢查呼叫bw.CancelAsync()

我該如何解決這個問題

+0

當代碼卡在接收呼叫中時,您的代碼不會看到CancellationPending。所以不要使用CancelAsync,而是關閉套接字。或者只是不要使用BGW,而是使用BeginReceive。 – 2013-03-24 17:42:52

回答

0

您正在混合異步調用和同步調用。您需要使接收異步或超載CancelAsync()函數也關閉套接字(這將使接收呼叫返回)。

如果你不能重載CancelAsync()函數,那麼你可以創建一個自定義的取消函數來關閉套接字並調用CancelAsync()