Vb.net 多线程应用程序中的System.ObjectDisposedException
我正在编写一个简单的程序来测试VB.NET的各种功能,稍后我将在一个更复杂的程序中使用它。其想法是通过串行端口com5发送消息。该消息将取自在应用程序文本框中输入的内容。后台工作人员(按下标记为“发送”的按钮时激活)持续发送消息。还有一个标签,它什么也不做Vb.net 多线程应用程序中的System.ObjectDisposedException,vb.net,multithreading,objectdisposedexception,Vb.net,Multithreading,Objectdisposedexception,我正在编写一个简单的程序来测试VB.NET的各种功能,稍后我将在一个更复杂的程序中使用它。其想法是通过串行端口com5发送消息。该消息将取自在应用程序文本框中输入的内容。后台工作人员(按下标记为“发送”的按钮时激活)持续发送消息。还有一个标签,它什么也不做 Imports System.ComponentModel Public Class Form1 Dim message Private Sub Button1_Click(sender As Object, e As EventArg
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未经处理消息:在中发生类型为“System.ObjectDisposedException”的未经处理的异常
mscorlib.dll其他信息:安全句柄已关闭
我相信这与后台工作程序有关,因为如果程序关闭,而我没有运行后台工作程序,则不会出现错误。我尝试在程序的每个子模块中放置一个try-catch(包括将SendSerialData中的catch的异常类型更改为any-exception),但没有成功。这是我在遇到问题时的第一篇帖子,请随意评论。您需要做的是向BackgroundWorker1\u DoWork线程发出程序正在关闭的信号,以便它能够正确地整理。这是.NET framework中的类已经知道如何做的事情 您需要执行以下操作:
- 使用BackgroundWorker运行任务
- 配置BackgroundWorker以接受取消请求
- 更改后台任务中的While循环以检查取消
- 退出程序时,请求取消后台任务,然后等待线程完成
注意:BackgroundWorker上的MSDN页面上有一个例子,它几乎完全可以实现您想要的功能。计算机连接到一个微控制器,该微控制器连接到一个电机,该电机可以读取串行输入。如果没有回路,电机会旋转一秒钟左右,然后停止。我如何设置它连续旋转而没有循环?谢谢。我曾尝试执行取消,但不知道在哪里实际取消后台工作人员。