0

デバイスに接続/再接続するために、vb.net のバックグラウンド スレッドを使用しています。正常に動作していますが、約 2 時間後に、コードの次の部分でプログラムが stackoverflow 例外をスローしています。

if connected = True then
   Thread.Sleep(500)
   Exit sub
endif

その後、私は再びサブを呼び出しています。

Sleep-Timeをたとえば1000ミリ秒に設定することもできますが、これは最善の解決策ではないと思います...「バックグラウンドワーカー」(ビジュアルスタジオを使用)がより良い解決策/私の問題を解決しますか?または、スタックをクリーンアップする可能性はありますか?

ご協力いただきありがとうございます!

編集:

Module connection
    Public Sub connect()
        connect_loop()
        connect()
    End Sub

Public sub connect_loop()
    if connected = True Then
         **HERE IS WHERE THE EXCEPTION IS THROWN**
         Thread.Sleep(500)
         Exit Sub
    Endif

    'Code for the Connection (ping, open Socket etc.)....

End Sub

エンドモジュール

モジュールは、メイン ルーチンからバックグラウンド スレッドとして開始されます。

Public background As New Thread(AddressOf connection.connect)
background.IsBackground = True
background.Start()

接続にコードが必要ですか? 実際の接続部分では例外がスローされないため、ここには記述しませんでした。また、2 時間すべて正常に動作します。

4

2 に答える 2

1

あなたのメソッドconnectは、それが戻る条件なしで再帰的です。

関数またはメソッドへの各呼び出しは、いくらかのスタック スペースを使用しますが、各スレッドにはそれだけのスタック スペースしかありません。

永遠にループしたい場合connectは、無限ループを使用してください (ただし、プロセスを停止したいときに lop がどのように終了するかを検討してください)。

于 2014-04-14T08:53:34.493 に答える
1
Public Sub connect()
   ...
   connect()
End Sub

明らかなスタック オーバーフローのどの部分が不明ですか? connect基準なしで再帰的に呼び出しています。スタックオーバーフローが保証されます。あなたSleep()だけが避けられないことを遅らせます。スレッド化は問題とは何の関係もありません。代わりにループのようなことをしたいかもしれません:

while(true)
 connect_loop()
end

(または while ループの VB 構文は何でも)。

于 2014-04-14T08:54:22.040 に答える