0
我做了一個小程序,允許單擊每個按鈕的單個計時器倒計時。 (例如,點擊按鈕1將啓動按鈕1的倒計時,同時更新按鈕本身上的文本以反映剩餘時間。)VB線程計時器更新UI
我現在擔心的是我不確定我的程序在多大程度上能夠在長跑。這是代碼的一小部分。
Private Sub depBtn_Clicked(sender As Button, e As EventArgs)
If sender.BackColor = Color.Green Then
Dim depRow() As Data.DataRow
Dim id As String = sender.Name
depRow = DepartmentDataSet.Departments.Select("ID Like '" & id & "'")
sender.BackColor = Color.Red
Dim timerBtn As New DepartmentTimer(sender, depRow(0)("Duration"), depRow(0)("ID"))
Dim TimerDelegate As New System.Threading.TimerCallback(AddressOf TimerTask)
Dim TimerItem As New System.Threading.Timer(TimerDelegate, timerBtn, 0, 1000)
timerBtn.timerRef = TimerItem
End If
End Sub
Private Delegate Sub TimerTaskDelegate(ByVal obj As Object)
Private Sub TimerTask(ByVal obj As Object)
If Me.InvokeRequired() Then
Me.Invoke(New TimerTaskDelegate(AddressOf TimerTask), obj)
Else
Dim depTimer As DepartmentTimer = DirectCast(obj, DepartmentTimer)
depTimer.countDown()
If depTimer.duration = -1 Then
depTimer.finish()
depTimer.timerRef.Dispose()
End If
End If
End Sub
我已閱讀並也經歷了,如果我是在UI線程上直接從計時器回調更新整個程序將崩潰。所以我最終根據http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/來使用代理。
這是一個正確的做法或我做任何冗餘/效率低下? 另外,當我處置Timer對象。我將如何去清理DepartmentTimer類實例(timerBtn)?一旦定時器耗盡,該按鈕可以再次激活,所以如果我沒有正確地處理它們,我擔心這些情況會累積起來。
在此先感謝您的幫助。
對不起回合這一點,但將意味着所有的按鈕將在相同的時間間隔倒計時?如果我在不同的時間點擊按鈕怎麼辦? – DamonAskavio 2015-01-21 07:36:06
不是。它們每秒更新一次,但每個DepartmentTimer實例中都有自己的持續時間。另外,我在我的例子中定義了「定時器」的聲明。試試看看它是否有效。只需註釋掉你的代碼,以便恢復。 – 2015-01-21 15:01:49