我正在编写一个简单的程序来测试VB.NET的各种功能,以后将在一个更复杂的程序中使用它。这个想法是通过串口com5发送一条消息。该消息将从应用程序文本框中输入的内容中提取。后台工作者(当按下标记为“发送”的按钮时被激活)连续发送消息。还有一个标签,什么都不做。
Imports System.ComponentModel
Public Class Form1
Dim message
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
message = TextBox1.Text
If BackgroundWorker1.IsBusy = False Then
BackgroundWorker1.RunWorkerAsync()
End If
End Sub
Sub SendSerialData(ByVal data As String)
' Send strings to a serial port.
Try
Using com5 As IO.Ports.SerialPort =
My.Computer.Ports.OpenSerialPort("COM5")
com5.WriteLine(data)
End Using
Catch ioex As System.IO.IOException
TextBox1.Text = ("COM5 Not Found!")
End Try
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
While (True)
SendSerialData(message)
End While
End Sub
End Class
最初,我使用Application.DoEvents(),但是速度很慢,而且我听说这是一种不好的编程习惯。(但是,这没有错误。)因此,我使用后台工作程序重写了该程序。现在,该程序在运行时运行良好,但是在关闭时会弹出:
未处理System.ObjectDisposedException消息:mscorlib.dll中发生了类型为'System.ObjectDisposedException'的未处理异常其他信息:安全句柄已关闭
我认为这与后台工作程序有关,因为如果程序已关闭并且我尚未运行后台工作程序,则不会出现该错误。我尝试将try-catch放置在程序的每个子程序中(包括将SendSerialData中的catch的异常类型更改为任何异常),无济于事。如果出现问题,这是我的第一篇文章。
您需要做的是向BackgroundWorker1_DoWork线程发出信号,表明该程序正在关闭,以便可以正确整理。.NET框架中的BackgroundWorker类已经知道该怎么做。
您需要执行以下操作:
注意:BackgroundWorker上的MSDN页面上有一个示例,它几乎可以完全满足您的要求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句