10

我在谷歌上搜索并在这里阅读了一些线程,但我还没有找到一种简单的方法让 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 应用程序等待几秒钟吗?

谢谢你。

4

8 回答 8

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 修改为十分之一或百分之一秒

于 2010-08-02T17:05:43.243 回答
7

这是 WinForms 还是 WPF?

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

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

于 2010-02-10T14:48:03.420 回答
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
于 2011-12-02T11:29:01.330 回答
4

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

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)

于 2018-06-11T09:17:37.740 回答
3

确实,解决方案有两个方面:1.)使用计时器而不是睡眠,睡眠按照它所说的那样,导致线程进入睡眠状态。2.) 使用多线程并让你的屏幕抓取功能在它自己的线程中运行,这将大大提高你的应用程序的响应能力。

Threading.Thread.Sleep(IntSleepTime)

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

于 2012-11-26T16:41:26.170 回答
1

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

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

这将执行 600 次每次 0.1 秒的睡眠,每个之间都有一个 DoEvents 来处理当前事件。0.1 秒应该是响应能力(事件在 0.1 秒内处理)和 CPU 消耗(这样做太快,您的应用程序将开始消耗大量 CPU 时间,即使在等待时)之间的良好折衷。

于 2010-02-10T14:52:37.523 回答
0

你正在使 UI 线程处理表单进入睡眠状态。如果你想让你的应用程序响应,首先创建一个在列表视图中添加项目的方法,当你的表单加载时使用线程启动该方法,现在使用 sleep 使你的列表视图线程睡眠,你的 from 将处于响应状态..

于 2013-09-20T09:47:13.093 回答
0

这是针对 VB 而不是 VBA

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

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

                   End Sub)


     End Function
于 2017-07-21T22:22:58.957 回答