简单,无阻塞的睡眠方式?

时间:2010-02-10 14:45:04

标签: vb.net sleep nonblocking

我用谷歌搜索并阅读了一些线程,但是我还没有找到一种简单的方法让VB.Net应用程序暂停一段时间并保持应用程序响应:

Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Threading.Thread

[...]

''#How to keep screen frop freezing?
While True
  ListBox1.Items.Clear()

  ListBox1.Items.Add("blah")

  ''#Not much difference
  ListBox1.Refresh()

  ''#Wait 1mn
  Sleep(60000)
End While

是否真的没有简单的非阻塞解决方案让VB.Net应用程序等待几秒钟?

谢谢。

8 个答案:

答案 0 :(得分:8)

Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer)
    Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds / 500
    For i = 1 To iHalfSeconds
        Threading.Thread.Sleep(500) : Application.DoEvents()
    Next i
End Sub

调用ResponsiveSleep暂停特定的代码片段,同时保持应用程序的响应性。为了使应用程序更具响应性,iHalfSeconds可以修改为十分之一秒或百分之一秒

答案 1 :(得分:7)

这是WinForms还是WPF?

如果是WinForms,你可以使用计时器而不是while循环。然后你的应用程序仍然会响应并提升事件。

在WPF中,我认为您必须根据DispatchTimer class制作自己的计时器。

答案 2 :(得分:4)

Private Sub wait(ByVal interval As Integer)
    Dim stopW As New Stopwatch
    stopW.Start()
    Do While stopW.ElapsedMilliseconds < interval
        ' Allows your UI to remain responsive
        Application.DoEvents()
    Loop
    stopW.Stop()
End Sub

答案 3 :(得分:2)

Timer建议确实是最好的方法。但是如果DoEvents仍然有效(我从5.0开始没有完成VB),你可以这样做:

For i = 0 To 600
    DoEvents
    Sleep(100)
Next

这将进行600次休眠,每次休息0.1秒,每次休眠之间有一个DoEvents来处理当前事件。 .1秒应该是响应性(事件在.1秒内处理)和CPU消耗之间的良好权衡(这样做太快,你的应用程序即使在等待时也会开始消耗大量的CPU时间。)

答案 4 :(得分:2)

真的,解决方案有两个方面: 1.)使用计时器代替睡眠,睡眠就像它说的那样,使线程睡眠。 2.)使用多线程并让屏幕报废功能在其自己的线程中运行,这将大大提高应用程序的响应能力。

Threading.Thread.Sleep(IntSleepTime)

是一个线程安全的休眠功能,它会暂停当前线程的指定时间,所以如果你要使用sleep,你可以在多线程环境中这样做,它会让你的应用程序的其余部分保持响应'只是睡了一个分支线程,而不是主线程。

答案 5 :(得分:1)

这段简单的代码怎么样 - :)

Private Async Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        MsgBox("This msgbox is shown immidiatly. click OK and hover mouse over other controls to see if UI is freezed")
        Await Task.Delay(5000)
        MsgBox("see? UI did'nt freez :). Notice the keyword 'Async' between Private and Sub")
    End Sub

在已声明的子网站上使用Async,然后将Await Task.Delay(milliseconds)代替Thread.Sleep(milliseconds)

答案 6 :(得分:0)

你正在制作用于将表单交给睡眠的UI线程。 如果你想让你的应用程序响应,首先制作一个方法,在列表视图中添加项目,当你的表单加载使用线程启动该方法时,现在使用睡眠使你的列表视图线程睡眠,你的来自将处于响应状态..

答案 7 :(得分:0)

这适用于VB而不是VBA

    Private Async Function PauseTime(ByVal MS As Integer) As Task

    Await Task.Run(Sub()                         
                           Thread.Sleep(MS)

                   End Sub)


     End Function