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