【问题标题】:TCPClient with a GUI带有 GUI 的 TCPClient
【发布时间】:2014-03-20 00:53:19
【问题描述】:

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

我的第一个项目是重写一个 IRC Channel Quote/Seen Bot 并让它显示加密货币统计数据。无论如何回到问题。

我已经设法让连接正常工作,但是当我尝试从“GetStream.Read”查看数据时,我的 Gui 冻结了,我可以理解为什么会发生这种情况,因为它处于 500 毫秒计时器,但不知道如何防止或克服它。它只是等待更多数据进来。

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

到目前为止我的代码

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

【问题讨论】:

标签: .net vb.net irc


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我相信 BeginRead 正是我要找的 :)
  • Asyc != 多线程。对于 IRC,一个好的抽象是为每个接收到的行触发一个事件。
  • @Johannes Kuhn,我们可以讨论并行和异步模式,但事实上异步任务是在辅助线程上执行的。程序员不必知道或关心这一点,但这是现实。
  • JFYI,还有一种叫做“Async IO”的东西。你知道,IOCP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2012-03-28
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多