3

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 の例外タイプを任意の例外に変更することを含む)、役に立ちませんでした。これは私の最初の投稿です。問題が発生した場合は、お気軽にコメントしてください。

4

1 に答える 1

2

あなたがする必要があるのは、BackgroundWorker1_DoWork スレッドに、プログラムが適切に片付けられるように閉じていることを通知することです。これは、.NET フレームワークのBackgroundWorkerクラスが既に実行方法を知っていることです。

次のことを行う必要があります。

  • BackgroundWorker を使用してタスクを実行する
  • キャンセル要求を受け入れるように BackgroundWorker を構成する
  • バックグラウンド タスクの While ループを変更してキャンセルを確認する
  • プログラムの終了時に、バックグラウンド タスクのキャンセルを要求し、スレッドが完了するのを待ちます。

注意: BackgroundWorker の MSDN ページには、ほぼ正確に実行する例があります。

于 2015-03-05T08:31:54.947 に答える