2013-06-23 52 views
0

在我當前的項目中,我發送和接收來自serversocket/clientsocket(TCP)的textmessages,就像聊天(我的項目是用VB.NET編寫的)。只要我將發送的字節轉換爲字符串並將它們呈現在msgbox()中,就可以工作。 此代碼處理該部分:將數據從socket通信傳遞到用戶界面

Try 
    client = ar.AsyncState 
    client.EndReceive(ar) 
    client.BeginReceive(bytes2, 0, bytes2.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client) 
    Try 
     Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes2) 
     MsgBox(message) 
     Array.Clear(bytes2, bytes2.GetLowerBound(0), bytes2.Length) 
    Catch ex As Exception 
     MsgBox("Error writing received message") 
    End Try 
Catch ex As Exception 
    MsgBox("Error receiving message from server") 
End Try 

到目前爲止好。但是,當我嘗試將「MsgBox(消息)」更改爲label1.text =消息時,出現錯誤:「寫入收到的消息時出錯」。那麼,我的問題就是爲什麼會發生這種情況,我可以採取什麼措施來糾正它,以便我的套接字能夠接收可添加到文本框和UI中其他內容的信息?

在此先感謝您的幫助,您可以提供

回答

0

使用委託和的BeginInvoke()正確元帥調用主UI線程:

Private Sub OnRecieve(ar As IAsyncResult) 
    Try 
     client = ar.AsyncState 
     client.EndReceive(ar) 

     Try 
      Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes2) 
      NewMessage(message) 
     Catch ex As Exception 
      MsgBox("Error writing received message") 
     Finally 
      Array.Clear(bytes2, bytes2.GetLowerBound(0), bytes2.Length) 
     End Try 

     client.BeginReceive(bytes2, 0, bytes2.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client) 
    Catch ex As Exception 
     MsgBox("Error receiving message from server") 
    End Try 
End Sub 

Private Delegate Sub MessageDelegate(ByVal msg As String) 

Private Sub NewMessage(ByVal msg As String) 
    If Me.InvokeRequired Then 
     Me.BeginInvoke(New MessageDelegate(AddressOf NewMessage), New Object() {msg}) 
    Else 
     Label1.Text = msg 
    End If 
End Sub 
+0

確定感謝這麼多Idle_Mind,我會試試這個明天再回來給你結果。我感到寬慰的是,修復可能相當簡單,所以我可以回到我的項目中,這個項目已經停止了很多。 –

+0

儘管我並不知道代碼的功能如何,但這似乎仍在工作:)非常感謝您的幫助 –

+0

您不應該從其他線程更新UI元素。這樣做會導致NewMessage()通過使用BeginInvoke()在UI主線程中運行。當查詢的控件(「Me」= Form)在另一個線程上創建時,InvokeRequired行將返回true。 BeginInvoke()行在與創建控件相同的線程中運行委託。這會導致對第二次運行返回false的同一方法進行遞歸調用,並且您可以放入else塊來安全地更新UI。 –

相關問題