多线程应用程序中的System.ObjectDisposedException

时间:2015-03-05 07:56:29

标签: 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(),但它很慢,我听说这是一个糟糕的编程习惯。 (但是,这没有错误。)所以我使用后台工作程序重写了程序。现在,程序在运行时运行正常,但是当关闭时,会弹出:

  

System.ObjectDisposedException未处理消息:发生了类型为“System.ObjectDisposedException”的未处理异常   mscorlib.dll其他信息:安全句柄已关闭

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

1 个答案:

答案 0 :(得分:2)

您需要做的是向BackgroundWorker1_DoWork线程发信号通知该程序正在关闭,以便它可以正常整理。这是.NET框架中的BackgroundWorker类已经知道如何做的事情。

您需要执行以下操作:

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

注意:BackgroundWorker上的MSDN页面有一个几乎完全符合您要求的示例。