0

我在 vb.net 中使用后台线程来连接/重新连接到设备。它工作正常,但大约 2 小时后,程序在我的代码的以下部分引发了 stackoverflow 异常:

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

在那之后,我再次打电话给Sub。

我知道,我可以将睡眠时间设置为例如 1000 毫秒,但我认为这不是最好的解决方案......“后台工作人员”(使用 Visual Studio)会是更好的解决方案/解决我的问题吗?或者是否有可能清理堆栈?

谢谢你的帮助!

编辑:

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 回答