带有GUI的TCPClient

时间:2014-03-20 00:53:20

标签: .net vb.net irc

我遇到了一个小问题(刚刚回到VB),对于我的无知/缺乏理解而感到抱歉。

我的第一个项目是重新编写IRC频道报价/ Seen Bot,并显示加密货币统计数据。无论如何回到问题。

我设法让连接正常工作,但是当我尝试查看来自" GetStream.Read"的数据时。我的Gui冻结,我可以理解为什么会发生这种情况,因为它所处的500ms定时器,而不是如何防止或克服它。它只是等待更多数据进入。

我希望有人会有一些想法,或者至少指出我正确的方向

到目前为止我的代码

Imports System.Net.Sockets
Imports System.Text

Public Class Form1
Dim vClient As New TcpClient()
Dim vIRCNick = "TESTIRCBOT"
Dim vIRCChannel = "#TESTIRCCHAN"
Dim bytesRead As Integer
Dim buffer(1024) As Byte

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    vClient.Connect("irc.freenode.net", 6667)
    IRCSend("USER " & vIRCNick & " 0 0 :TESTIRCBOT" & vbCrLf)
    IRCSend("NICK " & vIRCNick & vbCrLf)
    IRCSend("JOIN " & vIRCChannel & vbCrLf)

    Timer1.Enabled = True

End Sub

Private Sub IRCSend(vMsg)
    Dim bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(vMsg)
    vClient.GetStream.Write(bytes, 0, bytes.Length)
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    IRCSend("PRIVMSG " & vIRCChannel & " :" & TextBox3.Text & vbCrLf)
    TextBox3.Text = ""
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    bytesRead = vClient.GetStream.Read(buffer, 0, buffer.Length)
    If bytesRead > 0 Then
        RichTextBox1.Text = RichTextBox1.Text & (System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, bytesRead))
    End If

End Sub
End Class

1 个答案:

答案 0 :(得分:1)

您正在调用Read,这是一种同步方法。这意味着它将阻止当前线程,直到读取数据。当前线程是UI线程,因此UI冻结。

如果您希望UI不冻结,则需要在辅助线程上进行读取。这意味着要么在辅助线程上调用Read,要么调用ReadAsync或BeginRead。任何这些选项都会使代码复杂化,但这就是多线程的本质。

另请注意,即使您在辅助线程上读取数据,也必须仅在UI线程上更新UI。