2010-02-10 21 views
7

Busqué en Google para esto y leer algunos hilos aquí, pero no he encontrado una manera sencilla de tener un sueño uso de VB.Net por poco tiempo y aún así mantener la aplicación responde:manera simple, sin bloqueo para dormir?

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 

¿existe realmente ¿No hay una solución simple y sin bloqueo para que la aplicación VB.Net espere unos segundos?

Gracias.

+1

¿Cuál es el propósito del sueño? O quieres que duerma o quieres que responda. Si lo que intenta hacer es algo que ocurre a intervalos programados, entonces dígalo. – dbasnett

+0

Estoy escaneando una página web cada minuto, y me gustaría que la aplicación se detenga cada minuto sin que se congele la pantalla de la aplicación. ¿Todavía está bien usar DoEvents o se recomienda usar un temporizador? – Gulbahar

+0

@OverTheRainbow - Ver el comentario de nikie a continuación. Parece que es mejor que tengas un temporizador. –

Respuesta

7

¿Es esto WinForms o WPF?

Si se trata de WinForms, puede utilizar un temporizador en lugar de un ciclo while. Entonces tu aplicación aún responderá y generará eventos.

En WPF creo que tendrías que hacer tu propio temporizador basado en el DispatchTimer class.

+0

¿No hay temporizadores en WPF también? – CoderDennis

+0

Acabo de abrir un proyecto muy rápido y no vi ningún control Timer en el diseñador, por lo que muy bien podría ser, nunca he tenido que usar uno en WPF. Una búsqueda rápida en google me hace pensar que no está disponible (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/aaffea95-e735-492d-bd8a-2fdf7099a936/). –

+0

No tiene que ser un control, ¿verdad? Puede usar System.Timers.Timer o System.Threading.Timer en el código. – ryadavilli

2

La sugerencia del temporizador es realmente la mejor manera de hacerlo. Pero si todavía funciona DoEvents (que no he hecho desde VB 5.0), se puede hacer esto:

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

Esto haría 600 Capacidad de 0,1 segundos cada uno, con un DoEvents entre cada uno para controlar los eventos actuales. El .1 segundo debería ser una buena compensación entre la capacidad de respuesta (los eventos se manejan en .1 segundo) y el consumo de CPU (haga esto demasiado rápido y su aplicación comenzará a consumir una cantidad significativa de tiempo de CPU incluso mientras espera). ResponsiveSleep

+0

Estimado votante, mientras respetuosamente acepto su voto negativo, ¿consideraría dejar un comentario con el que podría mejorar mi respuesta? Gracias. – Wim

+0

No sé por qué esto fue downvoted tampoco. Las funciones se llaman Application.DoEvents y Thread.Sleep en .NET, pero cualquier persona con un MSDN actualizado lo hubiera descubierto. Cabe señalar que DoEvents puede conducir a todo tipo de comportamiento extraño (por ejemplo, si el formulario se cierra mientras la función se está ejecutando o si DoEvents vuelve a llamar a la misma función). Pero dijiste que no era la forma ideal de hacerlo . – Niki

+1

No soy el infractor, pero DoEvents no es una buena práctica. Causa problemas si el método no se escribe correctamente en la cuenta para la reentrada. –

7
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 

llamada para poner en pausa una determinada pieza de código, mientras que mantener la aplicación bastante sensible. Para hacer la aplicación más iHalfSeconds sensibles podrían ser modificados para décimas o centésimas de segundo

+1

Este método utiliza menos recursos de CPU que el cronómetro. – rsrobbins

+2

Tuve problemas con 'Application.DoEvents()'. Ver [aquí] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/48b4a763-7387-46da-8fc2-3e885670f62c/the-undo-operation-encountered-a-context-that-is -diferente? forum = netfxbcl), por ejemplo. – pelesl

+0

es que ':' construcción algo VB-specific? ¿Cómo se vería eso en C#? – Nyerguds

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 
2

En realidad, la solución es doble: 1. ) utiliza un temporizador en lugar de dormir, dormir hace lo que dice, causas el hilo para dormir 2.) Utilice multi-threading y haga que su función de eliminación de pantalla se ejecute en su propio hilo, esto mejorará en gran medida la capacidad de respuesta de su aplicación.

Threading.Thread.Sleep(IntSleepTime) 

es una función de sueño seguro hilo que hará una pausa en el flujo actual durante el tiempo especificado, por lo que si se va a usar de sueño, puede hacerlo en un entorno multi-threading y que se mantendrá el resto de su aplicación receptiva ya que solo está durmiendo un hilo ramificado, no el hilo principal.

0

U hacen el subproceso de la interfaz de usuario Que entregó el formulario para dormir. Si desea hacer que su aplicación responda, primero haga un método que agregue los elementos en la vista de lista y cuando su forma cargue comience ese método usando thread, ahora use sleep para hacer que ur list view thread sleep, y su ur estará en responsive estado ..

0

Esto es para VB no VBA

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

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

        End Sub) 


    End Function