我遇到了一个小问题(刚刚回到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
答案 0 :(得分:1)
您正在调用Read,这是一种同步方法。这意味着它将阻止当前线程,直到读取数据。当前线程是UI线程,因此UI冻结。
如果您希望UI不冻结,则需要在辅助线程上进行读取。这意味着要么在辅助线程上调用Read,要么调用ReadAsync或BeginRead。任何这些选项都会使代码复杂化,但这就是多线程的本质。
另请注意,即使您在辅助线程上读取数据,也必须仅在UI线程上更新UI。