2015-03-05 5 views
3

Я пишу простую программу для тестирования различных функций VB.NET, позже я буду использовать ее в гораздо более сложной программе. Идея состоит в том, чтобы отправить сообщение через последовательный порт com5. Сообщение будет взято из того, что введено в текстовое поле приложения. Фоновый работник (активируется при нажатии кнопки с надписью «Отправить») непрерывно передает сообщение. Существует также ярлык, который ничего не делает.System.ObjectDisposedException в многопоточном приложении

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 внутри каждой подпрограммы в программу (включая изменение типа исключения для catch в SendSerialData как любое исключение), безрезультатно. Это мой первый пост в случае проблем, которые вы можете свободно комментировать.

+0

Компьютер подключен к микроконтроллеру, подключенному к двигателю, который считывает последовательный вход. Без цикла двигатель вращается в течение секунды или около того, а затем останавливается. Как я могу настроить его на непрерывное вращение без петли? – TeslaK20

ответ

2

Что вам нужно сделать, так это сигнал к потоку BackgroundWorker1_DoWork, который программа закрывает, чтобы он мог правильно убрать. Это то, что класс BackgroundWorker в платформе .NET уже знает, как это сделать.

Вам нужно сделать следующее:

  • Используйте BackgroundWorker для выполнения задачи
  • Настройка BackgroundWorker принять запрос на отмену
  • изменить цикл Хотя в фоновом режиме для проверки отмены
  • При выходе из запроса программы отменить фоновое задание, а затем дождаться завершения потока.

NB: На странице MSDN на BackgroundWorker есть пример, который почти точно вы хотите.

+0

Спасибо. Я попытался осуществить отмену, но не знал, где фактически отменить фонового работника. – TeslaK20

 Смежные вопросы

  • Нет связанных вопросов^_^