【问题标题】:dynamic timer in vb.netvb.net中的动态计时器
【发布时间】:2012-02-29 22:02:00
【问题描述】:

我正在开发一个 .Net 4 中的 vb 应用程序。该应用程序会启动动态线程来运行一些作业。每个线程运行一个特定的工作,并在该线程内执行一个无限循环。必须这样,我不能有线程然后重新开始......

无论如何.. 我在循环中使用 threading.thread.sleep 让循环暂停一段时间,然后再次运行。似乎这不是一个好方法,也不推荐。所以我想也许我可以使用动态计时器或其他东西让线程在再次运行之前等待 30 秒。我希望有人能给我一些指导和示例代码。

谢谢 香农

~~~~~~~~~~编辑 嘿..我发现了问题,不..这不是后台线程中的睡眠..这是我没有意识到我在UI线程中输入的睡眠..我开始注释掉所有内容并开始逐个添加并找到它。抱歉,PEBKAM 错误...

感谢您的意见

【问题讨论】:

  • 你为什么断定 Thread.Sleep 不是一个好方法?只要线程不是 UI 线程 thread.sleep 就可以了 :)
  • 嗯,我也是这么想的.. 但是当我启动我的线程时,后台工作线程的一些睡眠状态.. UI 线程是响应式的,但经过几个睡眠周期后, UI 开始变得非常不稳定,然后没有响应。我读过几篇文章说这很可能是thread.sleep ..这就是我走这条路的原因
  • @sjums - 组中有一些噪音表明 sleep() 是一种反模式。有一些理由认为 sleep() 循环经常被用作线程间通信的蹩脚形式,(而且托管线程显然非常昂贵,以至于在一个空闲的喷气式客机中睡觉是一样的 - 大量浪费资源。有点像 .NET 主题,不是吗:)。
  • 只是为了笑,然后进入并注释掉后台工作线程中的 thread.sleep 并且 UI 保持响应......我知道这不是一个很好的测试......但会引导我相信睡眠给我带来了一些问题
  • @jvcoach23 - '这很可能是 thread.sleep' - 不,不是,(反正不是它本身)。

标签: vb.net multithreading timer


【解决方案1】:

使用下面的类来做延迟,我用同样的概念开发了 javascript:settimeout :

Public Class JSsetTimeout

    Public res As Object = Nothing
    Dim WithEvents tm As Timer = Nothing
    Dim _MethodName As String
    Dim _args() As Object
    Dim _ClassInstacne As Object = Nothing

    Public Shared Sub SetTimeout(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        Dim jssto As New JSsetTimeout(ClassInstacne, obj, TimeSpan, args)
    End Sub

    Public Sub New(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        If obj IsNot Nothing Then
            _MethodName = obj
            _args = args
            _ClassInstacne = ClassInstacne
            tm = New Timer With {.Interval = TimeSpan, .Enabled = False}
            AddHandler tm.Tick, AddressOf tm_Tick
            tm.Start()
        End If
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        RemoveHandler tm.Tick, AddressOf tm_Tick
        If Not String.IsNullOrEmpty(_MethodName) AndAlso _ClassInstacne IsNot Nothing Then
            res = CallByName(_ClassInstacne, _MethodName, CallType.Method, _args)
        Else
            res = Nothing
        End If
    End Sub
End Class

用法

JSsetTimeout.SetTimeout(ClassContainingMethod, "MethodName", 30000, OptionalParameters)

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2016-07-10
    • 2017-11-05
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多