vb.net - 多线程应用程序中的 System.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 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(),但速度很慢,而且我听说这是一种糟糕的编程习惯。 (然而,这没有错误。)所以我使用后台 worker 重写了程序。现在,程序在运行时运行良好,但在关闭时弹出:

System.ObjectDisposedException was unhandled Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll Additional information: Safe handle has been closed

我相信这与后台 worker 有关,因为如果程序关闭并且我没有运行后台 worker ,则不会出现错误。我曾尝试在程序的每个子程序中放置一个 try-catch(包括将 SendSerialData 中的 catch 的异常类型更改为任何异常),但无济于事。这是我的第一篇文章,如有问题请随时发表评论。

最佳答案

您需要做的是向 BackgroundWorker1_DoWork 线程发出程序正在关闭的信号,以便它可以正确地进行整理。这是BackgroundWorker .NET 框架中的类已经知道该怎么做。

您需要执行以下操作:

  • 使用 BackgroundWorker 来运行任务
  • 配置 BackgroundWorker 以接受取消请求
  • 更改后台任务中的 While 循环以检查取消
  • 退出程序时请求取消后台任务,然后等待线程完成。

注意:BackgroundWorker 上的 MSDN 页面有一个示例几乎可以完全满足您的要求。

关于vb.net - 多线程应用程序中的 System.ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872696/

相关文章:

java - 在Java中使用同步锁

.net - 为什么我的 FileStream 对象在我 "using"是 BinaryReader 对象时被处理?

c# - .NET 3.1 中的 ObjectDisposedException/SocketsHttpHandler

.net - 在 .NET 中发送电子邮件,电子邮件保存在用户的已发送项目中

vb.net - 简单的Emgucv网络摄像头提要似乎内存泄漏

c# - 将程序作为线程而不是进程执行

c# - 正确避免 ObjectDisposeException

vb.net - 如何解决 vb.net 中的 System.TypeInitializationException 是未处理的异常?

vb.net - 在VB中,计算每月的第5个工作日

java - 多个 RandomAccessFile 对象可以将数据写入同一个文件吗?