Gulbahar
Gulbahar

Reputation: 5537

Simple, non-blocking way to sleep?

I googled for this and read some threads here, but I haven't found a simple way to have a VB.Net application sleep for a little while and still keep the application responsive:

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

Is there really no simple, non-blocking solution to have a VB.Net application wait for a few seconds?

Thank you.

Upvotes: 10

Views: 42075

Answers (8)

MbPCM
MbPCM

Reputation: 497

How about this simple piece of code - :)

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

Use Async on declared sub and then put Await Task.Delay(milliseconds) instead of Thread.Sleep(milliseconds)

Upvotes: 5

Jimva
Jimva

Reputation: 36

This is for VB not VBA

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

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

                   End Sub)


     End Function

Upvotes: 0

KrazzyRider
KrazzyRider

Reputation: 1

U are make the UI Thread Which handing the form to sleep. If u want to make ur application responsive,first make a method which add the items in list view and when ur form loads start that method using thread,now use sleep to make ur list view thread sleep,and ur from will be in responsive state..

Upvotes: 0

Jarrod Christman
Jarrod Christman

Reputation: 390

Really, the solution is two fold: 1.) Use a timer instead of sleeping, sleep does as it says, causes the thread to sleep. 2.) Use multi-threading and have your screen scrapping function run in it's own thread, this will greatly enhance the responsiveness of your application.

Threading.Thread.Sleep(IntSleepTime)

Is a thread safe sleep function that will pause the current thread for the specified time, so if you were to use sleep, you can do so in a multi-threading environment and it will keep the rest of your app responsive as you're only sleeping a branched thread, not the main thread.

Upvotes: 3

Gbolahan
Gbolahan

Reputation: 420

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

Upvotes: 4

user408874
user408874

Reputation: 81

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

Call ResponsiveSleep to pause a particular piece of code whilst keeping the application fairly responsive. To make the application more responsive iHalfSeconds could be modified to tenths or hundredths of a second

Upvotes: 8

Wim
Wim

Reputation: 11252

The Timer suggestion is really the best way to do it. But if DoEvents still works (I haven't done VB since 5.0), you can do this:

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

This would do 600 sleeps of .1 second each, with a DoEvents between each to handle current events. The .1 second should be a good tradeoff between responsiveness (events get handled within .1 second) and CPU consumtion (do this too fast and your app will start consuming a significant amount of CPU time even while waiting).

Upvotes: 1

Seth Moore
Seth Moore

Reputation: 3545

Is this WinForms or WPF?

If it's WinForms you could just use a timer instead of a while loop. Then your app would still be responsive and raise events.

In WPF I think you would have to make your own timer based on the DispatchTimer class.

Upvotes: 7

Related Questions