【问题标题】:Background Workers and Successive Events后台工作人员和后续事件
【发布时间】: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


【解决方案1】:

SerialPort 类的DataReceived 事件在后台线程上引发,因此它不会阻塞 UI 线程,因此在这种情况下您不需要使用 BackgroundWorker。因为DataReceived 是在后台线程上调用的,所以如果您需要从该处理程序更新任何UI 控件,则需要使用Invoke

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多