Vb.net 启动窗体关闭导致启动屏幕线程错误

Vb.net 启动窗体关闭导致启动屏幕线程错误,vb.net,splash-screen,Vb.net,Splash Screen,我有一个我正在制作的桌面应用程序的启动屏幕。启动的工作方式是检查某些文件,如果发现它们,它会立即关闭并加载主窗体 但是,这样做会导致线程错误。我猜这是因为启动窗体在完全加载主窗体之前关闭 以下是错误消息: 跨线程操作无效:控件“frm_SplashScreen”是从创建它的线程以外的线程访问的 我尝试过让线程休眠,甚至使用计时器给表单加载时间。但到目前为止还没有成功 Private Sub frm_Load_Load(sender As Object, e As EventArgs) Handl

我有一个我正在制作的桌面应用程序的启动屏幕。启动的工作方式是检查某些文件,如果发现它们,它会立即关闭并加载主窗体

但是,这样做会导致线程错误。我猜这是因为启动窗体在完全加载主窗体之前关闭

以下是错误消息:

跨线程操作无效:控件“frm_SplashScreen”是从创建它的线程以外的线程访问的

我尝试过让线程休眠,甚至使用计时器给表单加载时间。但到目前为止还没有成功

Private Sub frm_Load_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If Dir("System.dll") = "" then
 Createfile()
 Frm_Main.show()
 Me.close()
Else  
 Frm_Main.show()
 Me.close()
End IF
有关启动屏幕的所有其他内容都在应用程序下的项目属性中完成。否则它只是一个空表单


如何解决此问题?

在WinForms中,启动屏幕不负责创建主窗体,也不应该这样做。如果在创建主窗体之前需要运行代码,且启动屏幕可见,请将该代码放入应用程序的
启动
事件中。以下是如何做到这一点:

  • 转到项目属性的应用程序选项卡(与设置启动窗体和启动屏幕的位置相同)
  • 单击“查看应用程序事件”
  • 在窗口顶部附近的事件下拉列表中,选择“启动”。如果启动事件还不存在,这应该为它创建一个事件处理程序方法(
    Private Sub-MyApplication\u Startup(sender,e)处理我。Startup
  • 将代码(示例代码中的
    If Dir(…)然后Createfile()
    内容)放入事件处理程序中
  • 在创建主窗体之前,将调用启动事件处理程序中的代码。启动屏幕将在另一个线程中自动创建、显示和销毁。您不需要担心创建或关闭启动屏幕,因为这是自动完成的


    如果启动代码确定您根本不希望显示主窗体,请在启动事件处理程序方法中设置
    e.Cancel=true
    ,应用程序将退出,而不是显示主窗体。

    根据我以前的经验,这是visual studio中的一个错误,它是将启动窗体设置为
    窗口状态的结果。最大化
    ,覆盖默认启动事件。因此,为了解决这个问题,您需要启动来嘲笑启动,然后在启动屏幕的表单关闭事件上设置事件,而不是直接在启动
    表单中运行。在5个以上的项目上运行了
    。他们都有相同的问题,直到我将最大化状态移动到飞溅关闭事件,例如

    Private sub splash_closed(....)
    Startup form.window state.maximized...
    End sub
    

    因此,问题实际上是事件冲突。

    您是创建了自己的启动屏幕还是使用了Visual Studio提供的内置模板?这是WinForms吗?您是否在项目属性中设置了项目的启动窗体和启动屏幕,或者您正在以其他方式执行此操作?我创建了它,因此添加了一个新的windows窗体,并将其设计为类似于启动。然后在项目属性中,我将splash设置为该形式。但是,我尝试了该模板,它仍然会产生相同的错误。