【发布时间】:2015-07-21 20:20:02
【问题描述】:
我又回来了,代码比上次多。我可以在这里和那里参考我以前的问题,但这个问题是独立的
我设法说服我的雇主放弃我使用的专有串行端口通信库,所以现在我从头开始使用 SerialPorts 和 BackgroundWorkers,以便了解它们的工作原理。
这是我的代码:
Imports System
Imports System.IO.Ports
Public Class Form1
'SerialPort Port and BackgroundWorker Worker declared in form
Delegate Sub AppendText_Delegate(ByVal txtBox As TextBox, ByVal str As String)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Port.PortName = ("COM9")
Port.BaudRate = 115200
Port.Parity = Parity.None
Port.StopBits = StopBits.One
Port.Handshake = Handshake.None
Port.ReadTimeout = 1000
Port.WriteTimeout = 1000
Port.Open()
AddHandler Port.DataReceived, AddressOf DataReceived
Worker.WorkerReportsProgress = True
Worker.WorkerSupportsCancellation = True
End Sub
Private Sub btnSend_Click(sender As System.Object, e As System.EventArgs) Handles btnSend.Click
Port.Write(txtInput.Text & vbCrLf)
End Sub
Private Sub DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
Worker.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles Worker.DoWork
If Worker.CancellationPending Then
e.Cancel = True
End If
AppendText_ThreadSafe(Me.txtOutput, Port.ReadLine())
End Sub
Private Sub AppendText_ThreadSafe(ByVal txtBox As TextBox, ByVal str As String)
If txtBox.InvokeRequired Then
Dim MyDelegate As New AppendText_Delegate(AddressOf AppendText_ThreadSafe)
Me.Invoke(MyDelegate, New Object() {txtBox, str})
Else
txtBox.AppendText(str)
End If
End Sub
End Class
此时我真的不确定DataReceived 事件和BackgroundWorker 是如何协同工作的。我应该将Worker.RunWorkerAsync() 放在哪里,以便仅在引发DataReceived 事件时才调用DoWork()?我应该将两个事件绑定到同一个方法吗?
感谢您的帮助,并对这个问题的简单性表示歉意。可以这么说,我才刚刚开始使用 BackgroundWorkers,并且仍在寻找立足点。
【问题讨论】:
-
我没有使用过它们,但我猜想使用
SerialPort类和DataReceived事件你不需要BackgroundWorker,因为DataReceived是在后台调用的线。您将需要使用Invoke来更新来自DataReceived的任何 UI 控件。 -
@Mark 你是对的!你的直觉比我的好。添加 If InvokeRequired... 语句可以解决所有问题。谢谢!如果您想要积分,我很乐意为您选择答案。
-
这个问题是否旨在替换“其他”串行库或如何包装它并将其用作一些新事件的基础。 “其他”库做了什么,你可以用 NET 东西替换它?
标签: vb.net multithreading events event-handling backgroundworker