Простой, неблокирующий способ спать? - PullRequest
9 голосов
/ 10 февраля 2010

Я погуглил по этому поводу и прочитал некоторые темы здесь, но я не нашел простого способа немного подождать, пока приложение 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 ]

8 голосов
/ 02 августа 2010
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 можно изменить до десятых или сотых долей секунды

7 голосов
/ 10 февраля 2010

Это WinForms или WPF?

Если это WinForms, вы можете просто использовать таймер вместо цикла while. Тогда ваше приложение все равно будет реагировать и вызывать события.

В WPF, я думаю, вам придется создать свой собственный таймер на основе DispatchTimer класса .

4 голосов
/ 02 декабря 2011
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
2 голосов
/ 26 ноября 2012

Действительно, решение состоит из двух частей: 1.) Используйте таймер вместо сна, сон делает, как он говорит, заставляет поток спать. 2.) Используйте многопоточность и включите функцию очистки экрана в своем собственном потоке, это значительно повысит скорость отклика вашего приложения.

Threading.Thread.Sleep(IntSleepTime)

Является поточно-безопасной функцией сна, которая приостанавливает текущий поток на указанное время, поэтому, если вы будете использовать режим сна, вы можете сделать это в многопоточной среде, и остальная часть вашего приложения будет реагировать так, как вы Спите только разветвленная нить, а не основная нить.

2 голосов
/ 10 февраля 2010

Предложение таймера действительно лучший способ сделать это. Но если DoEvents все еще работает (я не делал VB с 5.0), вы можете сделать это:

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

Это будет делать 600 снов по 0,1 секунды каждый с DoEvents между каждым для обработки текущих событий. .1 секунда должна быть хорошим компромиссом между отзывчивостью (события обрабатываются в течение .1 секунды) и загрузкой ЦП (делайте это слишком быстро, и ваше приложение начнет потреблять значительное количество ЦП даже во время ожидания).

1 голос
/ 11 июня 2018

Как насчет этого простого куска кода - :)

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)

0 голосов
/ 22 июля 2017

Это для VB, а не VBA

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

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

                   End Sub)


     End Function
0 голосов
/ 20 сентября 2013

U - это поток пользовательского интерфейса, который передает форму в спящий режим. Если вы хотите сделать ваше приложение отзывчивым, сначала создайте метод, который добавляет элементы в виде списка, и когда ваша форма загружается, запустите этот метод с использованием потока, а теперь используйте sleep, чтобы сделать просмотр представления вашего потока спящим, а ur from будет в отзывчивом состоянии ..

...