Vous êtes sur la page 1sur 9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Bienvenido(a), Visitante. Favor de ingresar o registrarse. Perdiste tu email de activacin?


Siempre Ingresar

Ingresar con nombre de usuario, contrasea y duracin de la sesin Web Blog Foro Ingresar Registrarse Ayuda Buscar

Foro de elhacker.net Pginas: [1] Ir Abajo


Autor

Programacin

Programacin General

.NET (Moderadores: Novlucker, seba123neo, EleKtro H@cker)

[Tutorial] System.Threading? Cmo y Cundo! (C#)


I M P RI M I R

Tema: [Tutorial] System.Threading? C mo y C undo! (C #) (Ledo 14,041 veces)


29

0 Usuarios y 1 Visitante estn viendo este tema.

[D4N93R]
Wiki

[Tutorial] System.Threading? Cmo y Cundo! (C#)


en: 13 Diciembre 2009, 20:08

Desconectado Mensajes: 1.645

Bueno este es un tuto que escrib hace unos 6 meses, y ahora lo comparto con la comunidad del hacker.net. Si encuentran algn error o algo, me avisan, La idea es ayudarnos y recordar que todos somos humanos.. La programacin Multi-Threading es uno de los aspectos peores manejados entre los programadores, por eso antes de comenzar a utilizarlos, debemos saber en qu consiste.

Qu es un hilo de ejecucin? Un Hilo de ejecucin o Thread es el contexto en donde se est ejecutando una porcin de cdigo, es decir, desde que comienza un programa ste fluye a travs de un Hilo de ejecucin (de ahora en adelante Thread). Antes de que los sistemas operativos soportaran Multi-Threading solamente un Thread era el que llevaba el flujo de la aplicacin. Ahora con las nuevas tecnologas y lo avanzados que estn los sistemas operativos
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 1/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

My softw are never has bugs. Its just features!

podemos crear nuevos Threads para desarrollar aplicaciones que las aprovechen y as mejorarlas en varios aspectos como el rendimiento o simplemente mejorar la interfaz de usuario.

Ok ya se que es Multi-Threading, pero Cundo debo utilizarlo? Existen varias ocasiones en las que es ideal el uso de un Thread o varios en conjunto para realizar una tarea. Por ejemplo: Caso 1: En un formulario tienes una consulta que se tarda aproximadamente 1 minuto, la consulta se ejecuta en el evento Click de un botn llamado button1 (jeje) , el usuario al hacer click y lanzar el evento va a tener que esperar que el proceso termine, mientras sto ocurre el formulario se deshabilita ya que el Thread que ejecuta el proceso es el mismo que dibuja la ventana, por lo cual aparece el famoso "(No Responde)" en el ttulo. - Solucin: Lanzar el proceso en otro Thread y deshabilitar el botn hasta que termine. Mientras se ejecuta avisar al usuario, ya sea el progreso o simplemente el estado. Caso 2: Tienes dos procesos (A y B) que se tienen que ejecutar al mismo tiempo, y no tienen nada que ver uno con otro y normalmente ejecutaras A y luego B para luego continuar el flujo de la aplicacin, pero Qu pasara si A se tarda 30 segundos y B 45 segundos? - Solucin: utilizar dos hilos paralelos para la ejecucin y as tomar ventaja de los Procesadores nuevos multincleo.

Existen otros casos, de los que estaremos hablando en prximos post!

Ahora por fin, Cmo lo hago? Antes de comenzar necesitamos definir un ltimo concepto, llamado Delegado. Un delegado es un tipo de dato especial el cual tiene como funcin "apuntar" a un mtodo cualquiera. Para que sto ocurra el delegado debe de estar declarado de forma tal que coincida con la firma del mtodo (Entindase firma por los parmetros). Para todos los ejemplos se usar el siguiente mtodo: void DoProcess(string text). Cmo uso un delegado:
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 2/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Primero creamos un delegado que coincida con la firma del mtodo:


Cdigo:

d e l e g a t ev o i dD o P r o c e s s D e l e g a t e ( s t r i n gt e x t ) ;
luego instanciamos:
Cdigo:

D o P r o c e s s D e l e g a t ed e l e g a t e=n e wD o P r o c e s s D e l e g a t e ( D o P r o c e s s ) ;
y ejecutamos:
Cdigo:

s t r i n ga=d e l e g a t e ( " h o l am u n d o " ) ;


Si! as de fcil! Y ahora bien, existen varias vas para crear un proceso nuevo e iniciarlo: Utilizando un Delegado Instanciamos y apuntamos hacia el mtodo:
Cdigo:

D o P r o c e s s D e l e g a t ed e l e g a t e=n e wD o P r o c e s s D e l e g a t e ( D o P r o c e s s ) ;
Llamamos al mtodo BeginInvoke del delegado para comenzar la ejecucin asncrona donde nos pide los parmetros del delegados ms dos, cuales son: AsyncCallback y un object. El AsyncCallback hace referencia al mtodo que se llama cuando se completa el proceso asncrono. El object lo recibe el mtodo que apunta el AsyncCallback. Ahora tenemos otro mtodo llamado void ProcessEnded(IAsyncResult obj) y pasamos "prueba" como token, aunque debera ser un valor diferente en casos de que se ejecute varias veces la llamada a BeginInvoke En ste caso podemos pasar un Guid: Guid.NewGuid().
Cdigo:

d e l e g a t e . B e g i n I n v o k e ( " H o l aM u n d o " ,n e wA s y n c C a l l b a c k ( P r o c e s s E n d e d ) ," p r u e b a " ) ;


Ahora el mtodo DoProcess se ejecuta de forma asncrona y luego el ProcessEnded cuando ste ltimo termine y le llega como parmetro "prueba".
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 3/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Y Qu pasa si nuestro DoProcess retorna algn valor? pues simplemente en el mtodo ProcessEnded llamamos a delegate.EndInvoke(obj). El obj es el parmetro de ProcessEnded.

Utilizando la clase Thread Otra forma de ejecutar un mtodo asncrono es usando la clase Thread. sta clase es la base de la ejecucin de los Threads. Su funcionamiento es un poco ms complicado. Ojo! su funcionamiento ms no su llamado, es decir, mediante el uso de la clase Thread tenemos a la mano un conjunto de opciones y clases un poco ms avanzadas sobre todo para el tema de la sincronizacin, de el cual les hablar en otro post. Bsicamente la clase tiene dos constructores, uno pide un delegado ThreadStart y otro pide un delegado ParametrizedThreadStart, el primero es para apuntar hacia un mtodo sin parmetros y el otro hacia uno con un parametro tipo object. Ambos funcionan de la misma manera por lo que vamos a utilizar ThreadStart. Ahora tenemos un mtodo nuevo
Cdigo:

v o i dD e l e t e A l l F i l e s ( ) ;
Cdigo:

T h r e a dm y T h r e a d=n e wT h r e a d ( n e wT h r e a d S t a r ( D e l e t e A l l F i l e s ) ) ;
ahora simplemente para iniciar el thread solo hace falta llamar al mtodo:
Cdigo:

m y T h r e a d . S t a r t ( ) ;
ste tiene una sobrecarga de un parametro object para el ParametrizedThreadStart.

La clase ThreadPool Un pequeo ejemplo del uso de ThreadPool es el siguiente : El mtodo QueueUserWorkItem tiene un parmetro el cual es un delegado de tipo WaitCallback, que es la referencia al mtodo que se va a ejecutar. Tambin tiene una sobrecarga para pasar un object.
Cdigo:

p u b l i cv o i dm a i n ( s t r i n g [ ]a r g s )
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 4/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

{ T h r e a d P o o l . Q u e u e U s e r W o r k I t e m ( n e wW a i t C a l l b a c k ( M y M e t h o d ) ) ; T h r e a d . S l e e p ( 5 0 0 0 ) ; / / E lS l e e p" d u e r m e "e lh i l oa c u a l ,s i n oh a c e m o s s t o , / / o t r ac o s aup r o c e s oe lh i l od e lT h r e a d P o o ln o / / s ee j e c u t a r y aq u ee lh i l op r i n c i p a ls et e r m i n a . } p u b l i cv o i dM y M e t h o d ( o b j e c to b j ) { / / A l g np r o c e s o }

El componente BackgroundWorker El BackgroundWorker es un componente que podemos arrastrar hasta el formulario, control de usuario o simplemente declararlo dentro de nuestro cdigo. Ejmplo bsico de su uso:
Cdigo:

s t a t i cv o i dm a i n ( s t r i n g [ ]a r g s ) { B a c k g r o u n d W o r k e rw o r k e r=n e wB a c k g r o u n d W o r k e r ( ) ; w o r k e r . D o W o r k + = n e wD o W o r k E v e n t H a n d l e r ( w o r k e r _ D o W o r k ) ; w o r k e r . R u n W o r k e r A s y n c ( ) ;/ / a q u t e n e m o su n as o b r ec a r g ap a r ap a s a r l e / / u no b j e c ta lm t o d ow o r k e r _ D o W o r k } s t a t i cv o i dw o r k e r _ D o W o r k ( o b j e c ts e n d e r ,D o W o r k E v e n t A r g se )
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 5/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

{ / / s t ec d i g os ee j e c u t aa s n c r o n o / / e ne lp a r m e t r oD o W o r k E v e n t A r g se n c o n t r a m o se lo b j e c tq u es ee n v i ad e s d eR u n W o r k e r A s y n c ( )

/ / a d e m sd el ap o s i b l i d a dd ec a n c e l a re ne . C a n c e l ,yd ee n v i a ru nv a l o rd er e t o r n op o re . R e s u l t }

Adems de proveernos con funcionamiento asncrono, el BackgroundWorker nos ofrece maneras para que nuestros mtodos "reporten" el progreso del proceso, adems de la capacidad de permitir la interrupcin de manera fcil de nuestro Thread. El resultado de la operacin que se enva a travs de e.Result lo podemos encontrar fcilmente suscribindonos al evento RunWorkerCompleted del BackgroundWorker.

Bueno sto fue todo por ahora! Pronto publicar ms artculos cmo ste y de otros tipos tambin!.. Gracias por leer! y no se olviden de comentar

Cablematic | WIFI
www.cablematic.net Todo en redes inalmbricas WIFI. Conectividad, cables y redes
En lnea

Lee la gua de conexin al IRC del Foro Blog: andreujuan.com Tw itter: @blogdejuan

raul338

Re: [Tutorial] System.Threading? Cmo y Cundo! (C#)


Respuesta #1 en: 13 Diciembre 2009, 20:21

foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855

6/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Desconectado Mensajes: 2.584

:O muy bueno, no lo lei a fondo, pero esta interesante, deben ponerle chincheta a esto Y tambien deberias ampliarlo, como por ejemplo hacer threads con semaforo (esperar a que uno o todos terminen) o el tipico caso en el que un thread necesita acceder a una variable que pertence a otro thread(un thread padre por ejemplo)

Mejor que LTE


www.skyDSL.eu/LTE
La sonrisa es la mejor forma de afrontar las cosas

NUEVO: Internet satelital sin Uso Justo desde 19,90 En vez de LTE!
En lnea

Meta

Re: [Tutorial] System.Threading? Cmo y Cundo! (C#)


Respuesta #2 en: 13 Diciembre 2009, 21:15

Desconectado Mensajes: 2.373

Muy bueno. Sleep (5000) es retardo de esa lnea de cdigo 5 segundos o 5000 milisegundos. Sleep tambin se usa mucho en ASM de microcontroladores PIC.

foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855

7/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Saludo.

En lnea Tutoriales Electrnica y PIC: http://electronica-pic.blogspot.com/

[D4N93R]
Wiki

Re: [Tutorial] System.Threading? Cmo y Cundo! (C#)


Respuesta #3 en: 14 Diciembre 2009, 01:04

Desconectado Mensajes: 1.645

Gracias por las respuestas,


Cita de: Meta en 13 Diciembre 2009, 21:15

Muy bueno. Sleep (5000) es retardo de esa lnea de cdigo 5 segundos o 5000 milisegundos. Sleep tambin se usa mucho en ASM de microcontroladores PIC . Saludo.

Si es Thread.Sleep() es en milisegundos.!
Cita de: raul338 en 13 Diciembre 2009, 20:21

:O muy bueno, no lo lei a fondo, pero esta interesante, deben ponerle chincheta a esto My softw are never has bugs. Its just features! Y tambien deberias ampliarlo, como por ejemplo hacer threads con semaforo (esperar a que uno o todos terminen) o el tipico caso en el que un thread necesita acceder a una variable que pertence a otro thread(un thread padre por ejemplo)

Claro, semaforos y mucho ms muy pronto.

En lnea

Lee la gua de conexin al IRC del Foro Blog: andreujuan.com Tw itter: @blogdejuan
foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855 8/9

09/11/13

[Tutorial] System.Threading? Cmo y Cundo! (C#)

Pginas: [1] Ir Arriba

I M P RI M I R

Ir a: ===> .NET

ir

Mensajes similares
Asunto Iniciado por Respuestas Vistas ltimo mensaje 13 Marzo 2012, 03:11 por BlackZeroX (Astaroth) 8 Agosto 2012, 19:56 por X3R4C K3R 5 Abril 2013, 16:32 por Aprendiz-Oscuro

Multi-Threading con winpcap.


Program acin C /C ++ Program acin C /C ++ Hardware

APOKLIPTICO X3R4CK3R Zorronde

9 0 3

1,438 190 508

[SFML 2.0] Threading or Objects.Update() ? Hyper threading - ayuda (SOLUCIONADO)

Temas destacados: Aprende hacking con prctica! -

arZone, el wargame de elhacker.net

lawebdegoku Yashira.org Internet mvil Underground Mxico thehackerway

MundoDivx indetectables.net Noticias Informatica Soluciones Web Tienda Wifi

Hispabyte Seguridad Colombia ADSL El Lado del Mal

Truzone Indejuegos eNYe Sec Blog Administrador Sistemas

ZonaPhotoshop Seguridad Informtica Seguridad Wireless Blog Uxio

Todas las we bs afiliadas e stn libre s de publicidad e ngaosa.

C opyright (2001-2013) Foro de elhacker.net Todos los derechos reservados. C onsulta el Disclaimer para mas informacin. Prohibida su reproduccin total o parcial sin el permiso explcito del autor. Powered by SMF | SMF 2006-2013, Simple Machines LLC

foro.elhacker.net/net/tutorial_iquestsystemthreading_iexclcomo_y_cuando_c-t277825.0.html;msg1366855#msg1366855

9/9

Vous aimerez peut-être aussi