我有一个预先定义的机器列表,并且持续时间以分钟为单位 当我的程序接收到来自机器的输入时,每台机器都是机械启动的,我将机器ID,启动时间,持续时间的增加值作为结束时间,机器的持续时间和状态存储在sql server数据库中。登记/> 在使用 vb .net和listview 的 win forms 屏幕中,我正在显示表中的数据并通过计时器刷新它。定时器间隔是一秒。查询还计算经过的时间并在列表视图中显示。并且当持续时间和经过的分钟达到相等程序时,从UI发送信号以更新数据库。现在使用计时器来进行此活动或更有效的threading.task是明智的。任何帮助都很受欢迎。 对于ref,带有查询的代码是
Sub loadfromtable()
Try
ListView1.Items.Clear()
Dim qry As String = "select *,DATEDIFF(second,starttime,cast(GETDATE()AS time))/60 as etime from tblconsole where status='A' AND DATEDIFF(second,starttime,cast(GETDATE()AS time))>0"
'old qry --"select *,'' as [etime] from tblconsole where status='A'"
Using db As New sqlDataclass
Dim dt As DataTable = db.bindData(qry)
If Not dt Is Nothing AndAlso dt.Rows.Count > 0 Then
For Each r As DataRow In dt.Rows
Dim itm As New ListViewItem(r(0).ToString)
itm.SubItems.Add(r(1).ToString())
itm.SubItems.Add(r(2).ToString())
itm.SubItems.Add(r(4))
itm.SubItems.Add(r(3))
itm.SubItems.Add(r("etime"))
ListView1.Items.Insert(0, itm)
Next
End If
End Using
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub
答案 0 :(得分:0)
您显示了根据计时器获取数据未更新数据的代码。 如果您没有在timer event逝去事件中向用户显示任何内容,则不会遇到线程问题。
在您的情况下使用计时器在技术上没有任何问题。看看有关计时器与TPL的讨论: Proper way to implement a never ending task. (Timers vs Task)
答案 1 :(得分:0)
请勿使用计时器。
计时器只是每秒触发一次事件,它不关心你的工作(更新数据库)花了多少时间。我们假设它需要0.5秒,这意味着你将更新半秒并等待半秒钟。如果它需要超过一秒钟,那么你将从2个线程并行更新,我想你不想这样做。
使用等待一秒钟的线程然后完成工作。您可以使用任务执行此操作,如果使用.Net 4.5,则可以使用async-await
,以便任务异步等待,而不会使用线程。