【问题标题】:update database using timer or task library使用计时器或任务库更新数据库
【发布时间】:2014-02-15 23:08:02
【问题描述】:

我有一个预先定义的机器列表和以分钟为单位的恒定持续时间。
当我的程序从机器接收输入时,每台机器都会机械启动,并且我将机器 id、开始时间、持续时间的附加值与开始时间作为结束时间、机器的持续时间和状态存储在 sql server 数据库中。 在 win forms 屏幕中使用 vb .net 和 listview 我正在显示表格中的数据并通过计时器刷新它。计时器间隔为一秒。该查询还计算经过的时间并显示在列表视图中。并且当持续时间和经过的分钟数达到相等时,从 UI 程序发送一个信号来更新数据库。现在使用计时器来此活动或 threading.task 更有效是明智的。非常感谢任何帮助。 对于参考,带有查询的代码是

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

【问题讨论】:

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


    【解决方案1】:

    不要使用计时器。

    计时器只是每秒触发一个事件,它并不关心您的工作(更新数据库)需要多少时间。假设它需要 0.5 秒,这意味着您将更新半秒并等待半秒。如果花费的时间超过一秒钟,那么您将从 2 个线程并行更新,我猜您不想这样做。

    使用等待一秒钟然后执行工作的线程。您可以使用 Task 执行此操作,如果您使用 .Net 4.5,则可以使用 async-await,因此任务异步等待而不会耗尽线程。

    【讨论】:

    • 好的,现在我想,我应该有一个计时器来不断更新列表视图和一个更新数据库的任务,这个任务必然是从 timer.tick 事件触发的,这会好吗?谢谢
    • 你可以,因为更新列表视图可能需要不到一秒的时间,但我建议始终使用某种周期性的休眠任务(或awaits)而不是计时器。跨度>
    • 对不起,我是菜鸟,有什么不使用计时器的具体原因吗,你能指点一下吗?
    • @sansknwoledge 我在回答中所说的话。无论如何,计时器每秒都会触发一次。该任务在上一次运行结束到当前运行开始之间等待一秒钟。如果工作时间超过一秒,工作将同时进行
    • @l3arnon,如果我在使用任务时尝试遍历列表视图,我遇到了跨线程冲突,我尝试调用它,但它没有抛出任何错误并挂起。代码在这里pastebin.com/Sgaf8DnL
    【解决方案2】:

    您展示了获取数据的代码,而不是根据计时器更新数据。 如果您没有在计时器事件经过事件上向用户显示任何内容,您将不会遇到线程问题。

    在您的情况下使用计时器在技术上没有任何问题。看看这里关于计时器与 TPL 的讨论: Proper way to implement a never ending task. (Timers vs Task)

    【讨论】:

    • 我只是打算在计时器内添加一个更新例程,我的想法基本上只是检查第 3 列的相等性、第 5 列的持续时间和经过的持续时间,如果第 5 列等于或超过则发送update 命令对表的状态进行更改。会不会影响流程或性能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2020-01-18
    • 2022-12-13
    • 2016-12-11
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多