我最近正在处理此错误:BeginInvokeStackflowError
我正在使用线程,根据我的研究,这是因为在线程.start()事件中它调用.invoke。如果在mainform_Load事件中完成,则在准备好之前,您会收到BeginInvoke错误。
所以我将代码从加载移动到显示的事件。但是,后台有很多东西我不想让用户看到。在我的代码中是否有一种方法来扩展启动画面我必须等到显示的主窗口第一次完成?
Private Sub MainWindow_Shown(sender As Object, e As EventArgs) Handles Me.Shown
'update table /search network
updateTable()
'clean
cleanupTable()
'fix label
updateLabel()
End Sub
答案 0 :(得分:1)
您的应用可以默认启动" MainForm" VB Application Framework
提供的方法。这将使用Sub Main
作为起点,允许您控制显示的内容和时间,以及之前发生的事情:
' IF your form is declared here, it will be
' available to everything. e.g.:
' Friend mainfrm As Form1
Public Sub Main()
' this must be done before any forms/controls are referenced
Application.EnableVisualStyles()
' the main form for the app
' just "mainfrm = New Form1" if declared above
Dim mainfrm As New Form1
' eye candy for the user
Dim splash As New SplashScreen1
splash.Show()
' your code here to do stuff.
' you can also invoke your procedures on the main form
' mainfrm.FirstTimeSetup()
' for demo purposes
System.Threading.Thread.Sleep(2500)
' close/hide the splash once you are done
splash.Close()
' see note
' start the app with the main form
Application.Run(mainfrm)
End Sub
如果您将启动画面声明为顶部的朋友,则可以真正扩展它,直到所有表单的加载事件完成并在那里关闭它。
答案 1 :(得分:0)
如果您已使用项目设置实现了启动屏幕,则无法扩展启动屏幕,但是您可以使用启动屏幕窗体作为初始窗体而不是主窗体。至于等待线程完成以显示表单(或隐藏启动画面),请考虑在主窗体中使用公共布尔值,并在线程完成后将其更改为True。您可以在初始屏幕上使用计时器来检查此布尔变化,然后将表单的不透明度更改回1.