Thread.Sleep() en C#

Haider Ali 12 octubre 2023
  1. Por qué thread.sleep() es perjudicial en C#
  2. Cómo funciona thread.sleep() en C#
  3. Programación asíncrona
  4. Ejecute dos métodos simultáneamente (palabras clave async y await en C#)
Thread.Sleep() en C#

En esta guía, aprenderemos por qué el uso de thread.sleep() en C# se considera dañino y por qué no se debe usar este enfoque en particular.

¿Qué sucede al usar thread.sleep()? ¿Hay algún enfoque alternativo?

Descúbrelo todo en esta guía. Sumerjámonos.

Por qué thread.sleep() es perjudicial en C#

Para entender por qué thread.sleep() es dañino, debemos entender el trabajo detrás de este método. Bueno, en C#, el método sleep tiene su uso.

Puede usarlo para pausar o suspender la funcionalidad actual (ejecución de subprocesos) durante un período específico. Podemos pasar el tiempo en milisegundos para suspender la ejecución del hilo durante algún tiempo.

También podemos usar la propiedad TimeSpan, como se muestra en el código a continuación.

// Time in milliseconds
Thread.Sleep(5000);
Or
    // Time in hours, minutes, seconds
    TimeSpan tsObj = new TimeSpan(0, 0, 5);
Thread.Sleep(tsObj);

Ahora, los dos enfoques anteriores detendrán el programa durante cinco segundos. Esto significa que, a través del código anterior, estamos tratando de suspender el hilo durante 1 segundo.

Pero, ¿cuál es el significado de todo esto? Vamos a entender el funcionamiento de la misma.

Cómo funciona thread.sleep() en C#

Todos sabemos que un programa se ejecuta por líneas, lo que significa que todo el programa se ejecuta sincrónicamente, una línea tras otra. A veces, durante la programación, necesitamos realizar una tarea que tarda un tiempo en completarse.

Por ejemplo, al obtener los datos de una API, podemos usar la función sleep para dejarlo esperar, obtener esos datos de la API y ejecutar el resto del programa más tarde. Este es un enfoque necesario pero muy dañino y pobre.

Por ejemplo, los datos que intentamos obtener pueden ser grandes y llevar tiempo. Nuestro programa se detendrá durante ese tiempo; ese no es un enfoque ideal.

Thread.Sleep(n) significa detener el subproceso en ejecución durante tantos intervalos de tiempo (también conocidos como subprocesos cuánticos) como sea posible en n milisegundos. La duración de un intervalo de tiempo varía según la versión o el tipo de Windows y el procesador utilizado, pero normalmente dura entre 15 y 30 milisegundos.

Esto indica que es probable que el subproceso se bloquee durante más de n milisegundos. Es poco probable que su hilo se vuelva a despertar precisamente n milisegundos más tarde.

Por lo tanto, Thread.Sleep no tiene ningún propósito en el tiempo.

Los subprocesos son un recurso finito que requiere aproximadamente 200 000 ciclos de creación y 100 000 ciclos de destrucción. De forma predeterminada, utilizan entre 2000 y 8000 ciclos para cada transición de contexto y reservan 1 megabyte de memoria virtual para su pila.

¿Cuál es el enfoque alternativo?

A veces necesitamos retrasar nuestro hilo para que el programa funcione perfectamente. Como se mencionó anteriormente, es posible que necesitemos obtener algunos datos de API, lo que lleva tiempo.

Pero detener todo el programa por eso es un mal enfoque. Entonces, ¿cómo evitamos eso?

Te presentamos la programación asíncrona.

Programación asíncrona

Las palabras clave async y await en C# ayudan a que la programación asíncrona sea muy común en estos días. Toda la aplicación tendrá que esperar para completar la operación cuando trabaje con la interfaz de usuario y use un método de ejecución prolongada que llevará mucho tiempo, como leer un archivo enorme o hacer clic en un botón.

En otras palabras, si algún proceso en una aplicación síncrona se bloquea, toda la aplicación también se detiene y nuestra aplicación deja de funcionar hasta que se haya completado toda la tarea.

En esta situación, la programación asíncrona es muy útil. La aplicación puede continuar con tareas que no dependen de su finalización empleando programación asíncrona.

Con la ayuda de las palabras clave async y await conseguiremos todas las ventajas de la programación asíncrona convencional con mucho menos trabajo.

Ejecute dos métodos simultáneamente (palabras clave async y await en C#)

Digamos que tenemos dos métodos, FirstMethod() y SecondMethod(), que son independientes entre sí y que FirstMethod() tarda mucho en realizar su tarea.

La programación síncrona comienza con FirstMethod() y espera a que termine antes de pasar a SecondMethod(), que luego se ejecuta. Incluso si ambos procedimientos son independientes, el proceso llevará mucho tiempo.

Podemos ejecutar todas las funciones al mismo tiempo mediante la programación de subprocesos simples, pero esto bloquearía la interfaz de usuario mientras esperamos que finalicen las tareas. En la programación tradicional, necesitaríamos escribir mucho código para resolver este problema, pero si utilizamos las palabras clave async y await, podemos resolver el problema con mucho menos código.

Veremos otros ejemplos también, y en esos casos, cuando SecondMethod() depende de FirstMethod(), utilizará la palabra clave await para esperar a que FirstMethod() termine de ejecutarse.

En C#, async y await son marcadores de código que indican dónde debe regresar el control cuando se ha completado una tarea.

Comenzar con ejemplos del mundo real lo ayudará a comprender mejor la programación detrás de ellos. Echa un vistazo al siguiente código.

class Program {
  static void Main(string[] args) {
    FirstMethod();
    SecondMethod();
    Console.ReadKey();
  }

  public static async Task FirstMethod() {
    await Task.Run(() => {
      for (int i = 0; i < 100; i++) {
        Console.WriteLine(" First Method");
        // Do something
        Task.Delay(100).Wait();
      }
    });
  }

  public static void SecondMethod() {
    for (int i = 0; i < 25; i++) {
      Console.WriteLine(" Second Method ");
      // Do something
      Task.Delay(100).Wait();
    }
  }
}

La salida del código anterior será la siguiente.

First Method
Second Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
Second Method
Second Method
Second Method
Second Method

Como puede ver en el código anterior, todo el programa no se detiene solo porque tenemos que dejar de ejecutar un hilo. Ambos pueden ejecutarse simultáneamente con el uso de programación asíncrona.

Digamos que se encuentra en algún punto en el que tiene que obtener algunos datos de la API, lo que lleva tiempo. Entonces, el programa pasará a la siguiente línea sin obtener los datos, por lo que debemos retrasarlo un poco para obtener esos datos y luego pasar a la siguiente línea.

Autor: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn

Artículo relacionado - Csharp Thread