none
pregunta sobre hilos RRS feed

  • Pregunta

  • hola, estoy desarrollando una appweb para graficar el ping de varias pcs de una empresa el problema esque son 1200 pcs y pense que podria usar hilos para cada ping lo que quiero saber es, si el cpu del servido tiene 4 hilos significa que solo puedo ejecutar 4 a la vez?
    sábado, 20 de julio de 2019 2:01

Todas las respuestas

  • Hola

    intenta con esto en en c#

     public delegate void Funcion();
    
     private void button1_Click(object sender, EventArgs e)
     {
         listBox1.Items.Clear();
         listBox2.Items.Clear();
         string ip = "192.168.0.";
         for (int i = 1; i < 256; i++)
         {
             Thread tr = new Thread(new ThreadStart(() => FindIp($"{ip}{i}")));
             tr.Start();
         }
     }
    
     public void FindIp(string ip)
     {
         bool isPing = false;
         Ping ping = null;
    
         try
         {
             ping = new Ping();
             PingReply reply = ping.Send(ip);
             isPing = reply.Status == IPStatus.Success;
         }
         catch (PingException)
         {
             // Discard PingExceptions and return false;
         }
         finally
         {
             if (ping != null)
             {
                 ping.Dispose();
             }
         }
    
         if (isPing)
         {
             Invoke(new Funcion(delegate ()
            {
                listBox1.Items.Add(ip);
            }
                 ));
         }
         else
         {
             Invoke(new Funcion(delegate ()
             {
                 listBox2.Items.Add(ip);
             }
                ));
         }
     }
    

    y en visual basic .net

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
         ListBox1.Items.Clear()
         ListBox2.Items.Clear()
         For index = 1 To 250
             Dim Ip = "192.168.0." + index.ToString
             Dim tr = New Thread(New ThreadStart(Sub() PingIp(Ip)))
             tr.Start()
         Next
     End Sub
    
     Private Sub PingIp(ByVal ip)
         If My.Computer.Network.Ping(ip) = True Then
             Llenatxt(ip)
         Else
             Llenatxt2(ip)
         End If
     End Sub
    
     Private Delegate Sub Funcion()
    
     Private Sub Llenatxt(ByVal ip As String)
         If Me.InvokeRequired Then
             Me.Invoke(New Funcion(Sub() Llenatxt(ip)))
         Else
             ListBox1.Items.Add(ip)
         End If
     End Sub
    
     Private Sub Llenatxt2(ByVal ip As String)
         If Me.InvokeRequired Then
             Me.Invoke(New Funcion(Sub() Llenatxt2(ip)))
         Else
             ListBox2.Items.Add(ip)
         End If
     End Sub


    • Editado Marti Llam sábado, 20 de julio de 2019 2:54
    sábado, 20 de julio de 2019 2:16
  • si el cpu del servido tiene 4 hilos significa que solo puedo ejecutar 4 a la vez?

    Si la CPU tiene 4 núcleos, significa que solo se pueden ejecutar 4 hilos a la vez. La clave aquí es entender que significa ese "ejecutar". Cuando uno de los hilos está esperando a una operación de entrada/salida, entonces en ese momento la CPU no está "ejecutando" nada sobre ese hilo. Si el código está bien escrito, durante ese tiempo la CPU puede ejecutar otro distinto.

    Eso quiere decir que tu CPU con 4 núcleos podría estar ejecutando cientos de hilos si esos hilos pasan la mayor parte de su tiempo esperando a operaciones de entrada/salida. Ese es el caso del ping, que ocupa poquísimos ciclos de CPU y luego pasa la mayor parte de su tiempo esperando una respuesta desde el exterior, sin que la CPU tenga que hacer nada con él. Por lo tanto, puedes tener cientos de hilos haciendo ping aunque solo tengas 4 cpus.

    sábado, 20 de julio de 2019 14:13
  • entonces puedo ejecutar 50 o 100 a la vez?
    sábado, 20 de julio de 2019 16:45
  • Sí, cincuenta o cien pings a la vez funcionarán sin ningún problema.
    sábado, 20 de julio de 2019 18:41
  • Hola Rafael felix Olivas, 

    No estoy muy seguro en ASP.NET pero en C puedes generar tantos hilos como necesites sobre el procesador, sólo tienes que considerar que como mejor opción de desempeño tanto para C así como para C# o cualquier lenguaje que bases en .NET Framework vas a tener una pequeña lentitud para que el administrador de tareas del procesador (el programador de tareas) meta los hilos a ejecución, realmente mi recomendación seria de utilizar métodos recursivos que maximicen 2 hilos para que vayas generando de 2 graficas en 2 hasta lograr las que necesitas y cada vez que se termine un método y vuelva a iniciar se generen hilos nuevos realmente en esa situación no vas a tener tantos problemas de desempeño asociadas con el resto de las tareas del procesador y del sistema operativo ya que los hilos van a mandar varias interrupciones al procesador puedes generar un bloqueo del resto de las tareas del S.O. y no se ejecutaría nada si tienes 4 nucleos te recomiendo usar máximo 2 hilos por nucleo y ingresarte a la programación asíncrona.

    Te dejo un enlace que describe teóricamente el proceso y recuerda por cada hilo creado tienes que tener un kill thread para evitar punteros libres en memoria que saturarían de igual manera la memoria RAM.

    https://docs.microsoft.com/es-es/dotnet/framework/data/adonet/asynchronous-programming

    Considera el dilema de los filósofos.

    https://es.wikipedia.org/wiki/Problema_de_la_cena_de_los_fil%C3%B3sofos

    Gracias por usar los foros de MSDN.
    Erick Rivera
     ____
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. 
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Editado eRiver1 domingo, 21 de julio de 2019 10:04 Grámatica
    domingo, 21 de julio de 2019 10:03