使用计时器或任务库更新数据库

时间:2014-01-22 07:00:13

标签: .net vb.net timer task-parallel-library

我有一个预先定义的机器列表,并且持续时间以分钟为单位 当我的程序接收到来自机器的输入时,每台机器都是机械启动的,我将机器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

2 个答案:

答案 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,以便任务异步等待,而不会使用线程。