System.ObjectDisposedException 在多线程应用程序中
System.ObjectDisposedException in Multithreaded Application
我正在编写一个简单的程序来测试 VB.NET 的各种功能,稍后我将在更复杂的程序中使用它。思路是通过串口com5发送消息。该消息将从应用程序文本框中输入的内容中获取。后台工作人员(当按下标记为 "send" 的按钮时激活)连续 t运行 发送消息。还有一个标签,什么都不做。
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 was unhandled Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in
mscorlib.dll Additional information: Safe handle has been closed
我相信这与后台工作者有关,因为如果程序关闭并且我没有运行后台工作者,则不会出现错误。我曾尝试在程序的每个子程序中放置一个 try-catch(包括将 SendSerialData 中的 catch 的异常类型更改为任何异常),但无济于事。这是我的第一个post如有问题欢迎评论。
您需要做的是向 BackgroundWorker1_DoWork 线程发出信号,表明程序正在关闭,以便它可以正确地整理。这是.NET framework中的BackgroundWorker class已经知道怎么做的
您需要执行以下操作:
- 使用 BackgroundWorker 运行 任务
- 配置 BackgroundWorker 以接受取消请求
- 更改后台任务中的 While 循环以检查取消
- 退出程序时请求取消后台任务,然后等待线程完成。
注意:BackgroundWorker 上的 MSDN 页面有一个几乎完全符合您要求的示例。
我正在编写一个简单的程序来测试 VB.NET 的各种功能,稍后我将在更复杂的程序中使用它。思路是通过串口com5发送消息。该消息将从应用程序文本框中输入的内容中获取。后台工作人员(当按下标记为 "send" 的按钮时激活)连续 t运行 发送消息。还有一个标签,什么都不做。
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 was unhandled Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll Additional information: Safe handle has been closed
我相信这与后台工作者有关,因为如果程序关闭并且我没有运行后台工作者,则不会出现错误。我曾尝试在程序的每个子程序中放置一个 try-catch(包括将 SendSerialData 中的 catch 的异常类型更改为任何异常),但无济于事。这是我的第一个post如有问题欢迎评论。
您需要做的是向 BackgroundWorker1_DoWork 线程发出信号,表明程序正在关闭,以便它可以正确地整理。这是.NET framework中的BackgroundWorker class已经知道怎么做的
您需要执行以下操作:
- 使用 BackgroundWorker 运行 任务
- 配置 BackgroundWorker 以接受取消请求
- 更改后台任务中的 While 循环以检查取消
- 退出程序时请求取消后台任务,然后等待线程完成。
注意:BackgroundWorker 上的 MSDN 页面有一个几乎完全符合您要求的示例。