關閉接收中的UdpClient

在撰寫Udp相關的應用時,呼叫Receive方法時會等候到接收了資料為止;因為這個特性,通常會使用另外一個Thread來處理Udp的動作,例如說一個接聽廣播封包的thread,專門對特定的port number等候廣播訊息,而接聽到指令之後進行特定動作,程式碼可能長的像是下面這樣

Private Sub WaitForCommand()
       
        Do
            If _bolStop Then Exit Do

            Try
                btyRecv = _client.Receive(_anyEndpoint)
                If btyRecv.Length > 0 Then
                    If ByteToStr(btyRecv) = "command" Then
                        ''do something
                    End If
                End If
            Catch ex As Exception  
                ''錯誤處理
            End Try

            Threading.Thread.Sleep(100)
        Loop
    End Sub

當執行到_client.Receive之後,就會在這一行指令等候資料接收,那麼在這個狀況之下,如果應用程式必須要關閉的話,要怎麼處理呢?Thread.Abort() ? 這個時候如果呼叫Thread的Abort方法還是無法停止Thread的運作 Orz

那麼應該怎麼做呢?搜尋了一下之後發現方法也是出乎意料的簡單,直接呼叫UdpClient的Close方法就可以了,那麼就可以用類似下面的方式來停止等候接收


Public Sub [Stop]()
        _bolStop = True
        Try
            If _client IsNot Nothing Then
                _client.Close()
            End If
        Catch ex As Exception
            ''錯誤處理
        End Try
    End Sub


其中要特別留意Exception的處理,因為呼叫了Close,在接受資料這邊是會出現錯誤狀況的;給大家參考看看了 :)

留言

這個網誌中的熱門文章

開啟cshtml檔案時,出現『並未將物件參考設定為物件執行個體』的錯誤訊息

無法設定中斷點 尚未載入符號檔

DataGridView欄位計算總合