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 は未処理でしたメッセージ: mscorlib.dll で 'System.ObjectDisposedException' 型の未処理の例外が発生しました追加情報: 安全なハンドルが閉じられました
プログラムが閉じられていて、バックグラウンド ワーカーを実行していない場合、エラーは表示されないため、これはバックグラウンド ワーカーと関係があると思います。プログラムのすべてのサブ内に try-catch を配置しようとしましたが (SendSerialData の catch の例外タイプを任意の例外に変更することを含む)、役に立ちませんでした。これは私の最初の投稿です。問題が発生した場合は、お気軽にコメントしてください。