tutorial threads runworkerasync example dowork c# multithreading network-programming backgroundworker

c# - threads - runworkerasync



Convierta la aplicaciĆ³n Ping en una versiĆ³n multiproceso para aumentar la velocidad-C# (2)

Bueno, mi consejo es analizar tus puntos de concurrencia.

En primer lugar, se tocará un error con cualquier acceso a los objetos de las formas de Windows fuera del hilo. es decir, su acceso al botón 1 arrojará un MDA en la depuración, y puede bloquearse en el tiempo de ejecución al azar. Tienes que usar un delegado e invocar el método en el hilo principal usando un patrón como este.

this.Invoke(delgatetomyupdatermethod)

En segundo lugar, su tiempo se gasta en el ping en sí mismo. Así que recomendaría escribir una lista de hilos (solo escriba un método con un candado)

private object locker = new object(); private void InsertIntoList(string linebuffer) { lock(locker) { ipList.Rows.Add(linebuffer); } }

Yo recomendaría utilizar .Net threadpool para ejecutar su método en lugar de hacer ping a una IP determinada.

Para hacerlo, escriba una función que contendrá la dirección IP para hacer ping y actualizar la lista con su resultado, luego llámelo haciendo cola en los elementos en el grupo de subprocesos. De hecho, si pasas un objeto con un evento ManualResetEvent incluso puedes escribir tu código para decir

System.Threading.WaitHandle[] waits = new System.Threading.WaitHandle[255]; //initialise the list of these and create the objects to ping. foreach (var obj in mylistofobjectvalues) { System.Threading.Threadpool.QueueUserWorkItem(method, obj); } System.Threading.WaitHandle.WaitAll(waits);

donde método es el método de ping, obj contiene un objeto con el evento manual e información que tu método necesita para hacer ping a su objetivo.

Cada vez que finalice su waithandle puede actualizar su estado. Con un poco más de esfuerzo en su GUI, incluso podría hacer que el sistema funcione de manera asíncrona, de modo que su GUI se actualice en cada respuesta, no solo al final.

Tengo una aplicación que hace ping a cada IP posible en su subred local para compilar una lista de direcciones IP receptivas. Actualmente hace ping all 255 uno a la vez. ¿Es posible convertir esta aplicación para usar varios hilos para aumentar la velocidad haciendo ping a más de uno a la vez? Soy nuevo en el concepto de múltiples hilos y creo que esta sería una buena forma de aprender (siempre que sea posible, por supuesto).

también, cualquier mejora estilística en la que me puedas educar también sería útil.

gracias antes de tiempo

Aquí está el método de ping actual en un evento backgroundWorker1_DoWork.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { count = 0; for (int i = 1; i < 255; i++) { Ping ping = new Ping(); PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i)); count += 1; if (pingreply.Status == IPStatus.Success) { status = "o"; repAddress = pingreply.Address.ToString(); ; repRoundtrip = pingreply.RoundtripTime.ToString(); repTTL = pingreply.Options.Ttl.ToString(); repBuffer = pingreply.Buffer.Length.ToString(); string[] lineBuffer = { status, repAddress, repRoundtrip, repTTL, repBuffer }; ipList.Rows.Add(lineBuffer); } progressBar.Invoke(new MethodInvoker(UpdateProgressBarByOne)); progressStatus.Text = ("Pinging IP " + count + " of 254"); } button1.Enabled = true; progressBar.Invoke(new MethodInvoker(ResetProgressBar)); }


Parece que Ping tiene una función SendAsync . Esta publicación (sé que es vb, pero solo para tener una idea) tiene un ejemplo. En resumen, simplemente cambie su Send to SendAsync y escuche el evento PingCompleted