带有 GUI 的 TCPClient
Posted
技术标签:
【中文标题】带有 GUI 的 TCPClient【英文标题】:TCPClient with a GUI 【发布时间】: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
【问题讨论】:
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 【参考方案1】:您正在调用 Read,这是一种同步方法。这意味着它将阻塞当前线程,直到读取数据。当前线程是 UI 线程,因此 UI 冻结。
如果您希望 UI 不冻结,则需要在辅助线程上进行读取。这意味着要么在辅助线程上调用 Read,要么调用 ReadAsync 或 BeginRead。这些选项中的任何一个都会使您的代码复杂化,但这就是多线程的本质。
另请注意,即使您在辅助线程上读取数据,也必须仅在 UI 线程上更新 UI。
【讨论】:
谢谢,我相信 BeginRead 正是我要找的 :) Asyc != 多线程。对于 IRC,一个好的抽象是为每个接收到的行触发一个事件。 @Johannes Kuhn,我们可以讨论并行和异步模式,但事实上异步任务是在辅助线程上执行的。程序员不必知道或关心这一点,但这是现实。 JFYI,还有一种叫做“Async IO”的东西。你知道,IOCP。以上是关于带有 GUI 的 TCPClient的主要内容,如果未能解决你的问题,请参考以下文章