我正在在.NET 4.0 WinForms應用程序(vb.net),我想問一下:多線程及的Thread.Sleep凍結GUI
我寫一段代碼,需要運行的每個特定的時間間隔。該任務將首先禁用表單中的按鈕,然後完成工作。在這項工作中的兩點,它必須等待1秒,然後繼續。完成後,它必須重新啓用該按鈕。
在整個過程中,我不想凍結gui。
我應該如何實施?我必須使用後臺工作者嗎?
隨意回答我在c#或vb.net,無論你喜歡!
提前致謝!
編輯:我到目前爲止已經做了(我用Aforge.NET框架捕捉攝像頭截圖):
我在形式拖着backgroung工人。在其DoWork的情況下,我進入主作品名稱:
Private Sub BackgroundWorker_camera_DoWork() Handles BackgroundWorker_camera.DoWork
do_evaluation()
End Sub
的do_evaluation子必須做一些工作,然後等待第二個(攝像機設備做好準備),捕捉攝像頭快照,再等待第二和完成工作:
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
由於系統需要一點時間來連接到硬件凸輪,子必須等待SE在Aforge_cam.start_source()
命令之後的cond,以便硬件完全初始化。
然後,在evaluate _from_camera中添加新幀捕獲事件的處理程序將導致在公共變量「屏幕截圖」中捕獲新幀。由於它需要十分之幾秒從網絡攝像頭捕捉幀,因此代碼必須等待捕捉截圖變量中的位圖才能繼續。因此2個睡眠命令。
我開始使用RunWorkerAsync
命令給後臺工作進程。 儘管如此,GUI凍結,我不明白爲什麼,因爲後臺工作人員在一個單獨的線程上運行,對不對?
告訴我們你到目前爲止所嘗試過的。由於缺乏您的信息,很難回答。一個後臺工作人員會工作,一個新的線程也會工作,但兩者都不同,具體取決於你想要什麼... – Codexer 2014-10-27 12:42:05