在vb.NET中使用Background Thread的StackOverFlow异常

时间:2014-04-14 07:34:32

标签: vb.net multithreading stack-overflow background-thread

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

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

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

我知道,我可以将睡眠时间设置为例如1000毫秒,但我认为这不是最好的解决方案...... “Backgroundworker”(使用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()

您是否需要连接代码?我没有在这里写它,因为Exception并没有被抛出真正的连接部分。此外,2小时一切正常。

2 个答案:

答案 0 :(得分:1)

您的方法connect是递归的,没有任何条件会返回。

对函数或方法的每次调用都会使用一些堆栈空间,每个线程只有很多堆栈空间。

如果你想让connect循环使用无限循环(但考虑当你想要停止进程时lop将如何退出)。

答案 1 :(得分:1)

Public Sub connect()
   ...
   connect()
End Sub

那么明显堆栈溢出的哪一部分对你来说不清楚?您以递归方式调用connect没有任何条件。它会堆叠溢出,保证。您的Sleep()只会延迟不可避免的事情。线程与问题无关。你可能想要像循环那样做一些事情:

while(true)
 connect_loop()
end

(或者是while循环的VB语法)。