Vb.net 我得到了;在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke;错误

Vb.net 我得到了;在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke;错误,vb.net,Vb.net,我有3个功能: wait():在处理时显示加载表单 runwait():使窗体加载在线程中工作 stopwait:在进程完成后停止从加载 问题:函数工作正常,但有时在某些形式下显示此错误“在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke” 当然,其中一个选择应该会让你满意 1.这很简单。只需显示表单并处理它。它不是模态的,它在您的原始UI线程上运行wait不是阻塞调用,因此不需要任何额外的线程。当窗口关闭时,一段时间后自动调用Dispose。如果您试图在关闭后进行处置,

我有3个功能:

  • wait():在处理时显示加载表单
  • runwait():使窗体加载在线程中工作
  • stopwait:在进程完成后停止从加载
问题:函数工作正常,但有时在某些形式下显示此错误“在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke”


当然,其中一个选择应该会让你满意

1.这很简单。只需显示表单并处理它。它不是模态的,它在您的原始UI线程上运行
wait
不是阻塞调用,因此不需要任何额外的线程。当窗口关闭时,一段时间后自动调用Dispose。如果您试图在关闭后进行处置,则它可能已被处置,您将获得所获得的异常。请参阅底部处理此情况的
stopwait
方法

公共子等待()
ld=新Wform()
ld.Show()
端接头
2.这是阻塞。显示对话框窗口可防止其他代码运行<如果要释放,则需要调用code>stopwait,因为对话框窗口在关闭时不会自动释放。在表单关闭之前,您不能使用您的呼叫表单

公共子等待()
ld=新Wform()
ld.ShowDialog()
端接头
3。用于从非UI线程调用
wait
的时间。(1.2.都可以使用此方法实现UI线程安全。)通常,当UI应用程序中存在多个线程时,使用InvokeRequired/Invoke模式是一种良好的做法

公共子等待()
如果我需要的话
调用(新操作(等待地址))
其他的
ld=新Wform()
ld.Show()
如果结束
端接头
ShowDialog
Show
在大多数情况下都应该满足您的要求;阻止还是不阻止

在所有情况下,
stopwait
看起来都一样

公共子stopwait()
如果ld不是什么,那么
如果需要ld.invoker,则
ld.Invoke(新操作(stopwait的地址))
其他的
如果不是ld.IsDisposed,则ld.Dispose()
如果结束
如果结束
端接头

这有什么意义?您能不能只
ld.Show()
ld.Dispose()
?如果没有此UI挂起可能的副本,您需要先创建控件,然后再对其执行任何操作;而不是把它扔掉在线程世界里。进入
Control.CreateControl
方法中。我想@djv要问的是这个方法的用例是什么?这些年来,我做过很多库存管理系统,从来没有做过这样的事情。也许,如果我们能确切地理解你们为什么要这样做,我们就能为你们提供更好的答案
Public Sub wait()
    ld = New Wform
    Application.Run(ld)
End Sub

Public Sub runwait()
    Dim th As System.Threading.Thread = New Threading.Thread(AddressOf wait)
    th.SetApartmentState(ApartmentState.STA)
    th.Start()
End Sub

Public Sub stopwait()
    ld.BeginInvoke(New Action(Sub() ld.Dispose()))
End Sub