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