【问题标题】:StackOverFlow Exception using Background Thread in vb.NET在 vb.NET 中使用后台线程的 StackOverFlow 异常
【发布时间】:2014-04-14 07:34:31
【问题描述】:

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

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

之后,我再次调用 Sub。

我知道,我可以将睡眠时间设置为例如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 小时一切正常。

【问题讨论】:

  • 我们需要更多信息/代码来更好地了解问题所在:无论如何我认为解决方案可能不是清理堆栈(永远不是解决方案),您需要了解什么正在堆积到堆栈中并从根本上解决问题
  • 运行一个子程序,完成它,然后再次运行相同的程序会导致堆栈溢出,这并没有什么特别的原因。我认为您的问题出在其他地方,在您没有向我们展示的代码中。
  • 我添加了更多代码。这足够了吗,还是您需要更多详细信息?

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


【解决方案1】:

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

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

如果您希望connect 永远循环,只需使用无限循环(但请考虑当您想停止进程时 lop 将如何退出)。

【讨论】:

  • 所以你的意思是,我可以将 connect() 作为后台线程启动,然后在这个方法中放置一个无限循环?不用一直调用另一个方法?
【解决方案2】:
Public Sub connect()
   ...
   connect()
End Sub

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

while(true)
 connect_loop()
end

(或者什么是用于 while 循环的 VB 语法)。

【讨论】:

  • 所以你的意思是,我可以将 connect() 作为后台线程启动,然后在这个方法中放置一个无限循环?不用一直调用另一个方法?
  • 谢谢!您认为使用 while(true) 循环会引发任何错误或异常吗?我有点害怕超载我的应用程序或其他什么?使用 While(true) 循环来确保我的应用程序始终连接或重新连接自身有什么不好的吗?我需要睡眠定时器吗?
猜你喜欢
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多