我正在.net 4.0(vb.net)制作一个WinForms应用程序,我想问一下:
我正在编写一段需要运行每个特定时间间隔的代码。此任务将首先禁用表单中的按钮,然后执行工作。在此工作期间的2点,它必须等待1秒然后继续。完成后,必须重新启用该按钮。
在整个程序中,我不想冻结gui。
我应该如何实现这个目标?我必须使用后台工作人员吗?
随时随地用c#或vb.net回答我,无论你喜欢什么!
提前致谢!
编辑:到目前为止我所做的工作(我正在使用Aforge.NET框架捕获相机屏幕截图):我在表格中拖了一个背景工作者。在DoWork活动中,我输入了主要作品的名称:
Private Sub BackgroundWorker_camera_DoWork() Handles BackgroundWorker_camera.DoWork
do_evaluation()
End Sub
do_evaluation sub必须做一些工作,然后等待一秒钟(让相机设备准备就绪),捕捉相机快照,等待一秒钟并完成工作:
Public Delegate Sub do_evaluationDelegate()
Public Sub do_evaluation()
If Me.InvokeRequired Then
Me.Invoke(New do_evaluationDelegate(AddressOf do_evaluation))
Return
End If
ButtonX_Evaluate.Enabled = False
ButtonX_restore.Enabled = False
...some work...
evaluate_from_camera()
...some work...
Main.ButtonX_Evaluate.Enabled = True
Main.ButtonX_restore.Enabled = True
ReleaseMemory()
End Sub
来自相机子的评估:
Public Delegate Sub evaluate_from_cameraDelegate()
Public Sub evaluate_from_camera()
If Me.InvokeRequired Then
Me.Invoke(New evaluate_from_cameraDelegate(AddressOf evaluate_from_camera))
Return
End If
Aforge_cam.start_source()
'wait for 1sec
Thread.Sleep(1000)
AddHandler Aforge_cam.videoSource.NewFrame, AddressOf Aforge_cam.video_NewFrame
'wait for 1sec
Thread.Sleep(1000)
Aforge_cam.CloseVideoSource()
End Sub
由于系统需要一点时间连接到硬件凸轮,因此sub必须在Aforge_cam.start_source()
命令后等待一秒钟,以便硬件完全初始化。
然后,在evaluate _from_camera中添加新帧捕获事件的处理程序将导致在公共变量" screenshot"中捕获新帧。由于需要几十分之一秒才能从网络摄像头捕获帧,因此代码必须等待捕获屏幕截图变量中的位图才能继续。因此,2个睡眠命令。
我使用RunWorkerAsync
命令向后台工作者开始此过程。
然而,GUI冻结了,我无法理解为什么,因为后台工作者在一个单独的线程上运行,对吗?