texto significado reservadas programacion poner palabras dev como c# vb.net

programacion - palabras reservadas en c# y su significado



¿Cómo hago que mi programa de C#se duerma durante 50 ms? (9)

Hay básicamente 3 opciones para esperar en (casi) cualquier lenguaje de programación:

  1. Espera suelta
    • Ejecutar bloques de subprocesos durante un tiempo determinado (= no consume potencia de procesamiento)
    • No es posible procesar en el hilo bloqueado / en espera
    • No tan preciso
  2. Espera ajustada (también llamada bucle cerrado)
    • el procesador está MUY ocupado durante todo el intervalo de espera (de hecho, generalmente consume el 100% del tiempo de procesamiento de un núcleo)
    • Algunas acciones se pueden realizar mientras se espera.
    • Muy preciso
  3. Combinación de los 2 anteriores
    • Generalmente combina la eficiencia de procesamiento de 1. y la precisión + la capacidad de hacer algo de 2.

para 1. - Espera suelta en C #:

Thread.Sleep(numberOfMilliseconds);

Sin embargo, el programador de subprocesos de Windows hace que la precisión de la Sleep() sea ​​de unos 15 ms (por lo que la suspensión puede esperar fácilmente 20 ms, incluso si está programado para esperar solo 1 ms).

para 2. - La espera apretada en C # es:

Stopwatch stopwatch = Stopwatch.StartNew(); while (true) { //some other processing to do possible if (stopwatch.ElapsedMilliseconds >= millisecondsToWait) { break; } }

También podríamos usar DateTime.Now u otro medio de medición de tiempo, pero el Stopwatch es mucho más rápido (y esto realmente sería visible en un circuito cerrado).

para 3. - Combinación:

Stopwatch stopwatch = Stopwatch.StartNew(); while (true) { //some other processing to do STILL POSSIBLE if (stopwatch.ElapsedMilliseconds >= millisecondsToWait) { break; } Thread.Sleep(1); //so processor can rest for a while }

Este código regularmente bloquea el subproceso durante 1 ms (o un poco más, según la programación de subprocesos del sistema operativo), por lo que el procesador no está ocupado durante ese tiempo de bloqueo y el código no consume el 100% de la energía del procesador. Otro procesamiento aún se puede realizar entre el bloqueo (como la actualización de la interfaz de usuario, el manejo de eventos o la interacción / comunicación).

¿Cómo hago que mi programa de C # se duerma durante 50 milisegundos?

Esto puede parecer una pregunta fácil, ¡pero estoy teniendo un momento de falla cerebral temporal!


Lo mejor de ambos mundos:

using System.Runtime.InteropServices; [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod", SetLastError = true)] private static extern uint TimeBeginPeriod(uint uMilliseconds); [DllImport("winmm.dll", EntryPoint = "timeEndPeriod", SetLastError = true)] private static extern uint TimeEndPeriod(uint uMilliseconds); /** * Extremely accurate sleep is needed here to maintain performance so system resolution time is increased */ private void accurateSleep(int milliseconds) { //Increase timer resolution from 20 miliseconds to 1 milisecond TimeBeginPeriod(1); Stopwatch stopwatch = new Stopwatch();//Makes use of QueryPerformanceCounter WIN32 API stopwatch.Start(); while (stopwatch.ElapsedMilliseconds < milliseconds) { //So we don''t burn cpu cycles if ((milliseconds - stopwatch.ElapsedMilliseconds) > 20) { Thread.Sleep(5); } else { Thread.Sleep(1); } } stopwatch.Stop(); //Set it back to normal. TimeEndPeriod(1); }


No puede especificar un tiempo de suspensión exacto en Windows. Necesitas un sistema operativo en tiempo real para eso. Lo mejor que puedes hacer es especificar un tiempo mínimo de sueño. Luego le toca al programador activar su hilo después de eso. Y nunca llame a .Sleep() en el hilo de la GUI.


Para la legibilidad:

using System.Threading; Thread.Sleep(TimeSpan.FromMilliseconds(50));


Usa este codigo

using System.Threading; // ... Thread.Sleep(50);


Ya que ahora tiene la función async / await, la mejor manera de dormir durante 50 ms es usando Task.Delay:

async void foo() { // something await Task.Delay(50); }

O si está apuntando a .NET 4 (con Async CTP 3 para VS2010 o Microsoft.Bcl.Async), debe usar:

async void foo() { // something await TaskEx.Delay(50); }

De esta manera no bloquearás el hilo de la interfaz de usuario.


System.Threading.Thread.Sleep(50);

Sin embargo, recuerde que hacer esto en el subproceso de la GUI principal impedirá que la GUI se actualice (se sentirá "lento")

Sólo quite el ; para que funcione también para VB.net.


Thread.Sleep


Thread.Sleep(50);

El subproceso no se programará para su ejecución por el sistema operativo durante el tiempo especificado. Este método cambia el estado del hilo para incluir WaitSleepJoin.

Este método no realiza el bombeo estándar de COM y SendMessage. Si necesita dormir en un hilo que tiene STAThreadAttribute, pero desea realizar el bombeo estándar de COM y SendMessage, considere usar una de las sobrecargas del método de unión que especifica un intervalo de tiempo de espera.

Thread.Join