Trabajar con hebras en Visual Basic .Net

Escrito en Febrero 26, 2009 por Alex

En .Net podemos trabajar con hebras independientes de ejecución en las aplicaciones es decir, que una o varias hebras en el programa pueden compartir ciclos del procesador.

Al trabajar con hebras podemos también tener control sobre ellas, suspenderlas, cancelarlas y otras funciones.

En el post anterior les explicaba que podemos encontrarnos con un problema que no podíamos solucionar en versiones anteriores de visual basic, que sucedía cuando al presionar un botón (como el ejemplo de enviar un correo con archivos adjuntos), el proceso que iniciaba se tardaba más de los esperado y no podíamos cancelarlo porque acaparaba todos los recursos del sistema y aunque existiera un botón que cancelara el proceso, no podíamos verlo porque el programa parecía estar bloqueado o congelado.

Al situar el proceso dentro de una hebra podemos seguir actuando con el formulario.

Para esto utilizamos la clase Thread dentro del espacio de nombres Threading

Estos son algunos métodos de la clase Thread:

  • Start: Hace que se programe un subproceso para su ejecución.
  • Sleep: Bloquea el subproceso actual durante el número de milisegundos especificado.
  • Abort: Cancela la ejecución de la hebra.Para iniciar un hebra

Primero hay que importar el espacio de nombres System.Threading, después crear el objeto de tipo Thread.

 

Imports System.Threading
 
Private Sub btnEnviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviar.Click
        'Instanciar la hebra
        Dim oHebra As Thread
        'crear objeto y asignarlo al sub que queremos ejecutar
        oHebra = New Thread(AddressOf EnviarMail)
        'ponerla en marcha
        oHebra.Start()
 
End Sub

Para ver mejor este ejemplo, pongo en el siguiente link un ejemplo de un formulario para envío de correo por SMTP que es la parte completa del post anterior y esta programado con hebras, con barra de progreso y con opción de enviar archivos adjuntos y usando autenticación.

Ejemplo Mail desde Visual Basic 2008

Ejemplo Mail desde Visual Basic 2005

Algunas capturas de pantalla: 

Mail desde Vb.Net

Mail desde Vb.Net

 

Envio de correo desde visual basic .net

Envio de correo desde visual basic .net

Si te gusto este artículo Suscribete a nuestro feed

22 Comentarios en “Trabajar con hebras en Visual Basic .Net”

  1. omar |

    …uta….. excelente código,

  2. Santos |

    Cuando lo ejecuto, tarda unos 40 segundos y arroja la leyenda: “Se excedio el tiempo de espera de la aplicacion”; y en otras oportunidades me dice que la direccion de destino (mail) no está disponible y ,muestra tambien una direccion ip…Que puede ser? ya probe de todo, con distintos servidores de correo, cambiando el puerto smtp, etc, pero no hay caso. Me gustaria y necesitaria lograr que funcione. Desde ya, muchas gracias!!

  3. Alex |

    Santos:
    Hay un parámetro llamado timeout que necesitas cambiarlo porque el valor que tiene es para gmail y claro, si los archivos adjuntos son demasiados y ademas tu conexión es lenta, necesitas aumentar el valor.

    Con otros servidores puede darte error dependiendo del proveedor de Internet que usas y la razón es que el puerto que usas en el servidor de gmail es diferente del habitual que es el puerto 25, este puerto 25 lo usan la mayoria de los servidores y algunos proveedores de internet como por ejemplo en México (Telmex) bloquean este puerto para evitar enviar correos por este puerto y controlar asi el spam.

    Eso se soluciona pidiendo el desbloqueo al proveedor en caso de que sea el problema.
    saludos…

  4. Probando |

    Hola mira tengo una duda esto funciona a la perfeccion pero como puedo hacer que el progressbar trabaje cuando se inicialize el CMD tngo un bath que lo ejecuto y corre a la perfeccion pero quiero mostrar el progressbarr que esta funcionando y cuando termine me muestre un label fin y el progrssbarr se detenga esto es tranparente solo tengo quever el cmd en procesos y activarse el progrssbar

  5. Voskater |

    Si os pone que os habeis excedido debes buscar en el código fuente la línea que pone “usuario@gmail.com” , “contraseña” y la sustituis por la vuestra ejemplo:

    “pepe@gmail.com” , “pepe321″

  6. Hugo |

    tengo que tener configurado algun smtp, y si fuera el caso cual y como lo hago ….. ?

  7. Alex |

    En este ejemplo se utiliza el smtp de Gmail por lo que no necesitas ninguno.
    Si quieres usarlo solo cambias los datos de gmail por el tuyo.

  8. Alex_2 |

    Hola, si quisiera utilizar como motor de envío de correo Exchange en lugar de SMTP y además quisiera aplicar la opción de firmado y cifrado del correo, ¿qué cambios debería hacer?

  9. Alex |

    Exchange:
    Agregar una referencia MAPI al proyecto.
    Aqui algo de info:
    http://support.microsoft.com/kb/266353/es

    Código de ejemplo aquí:
    http://msdn.microsoft.com/es-es/library/bb397828.aspx

    Pero la manera de hacerlo cambia completamente.

  10. Moises |

    Excelente y funcionando como siempre, gracias y saludos!!

  11. Candidman |

    Ha funcionado a la perfección utilizando cuenta de gmail…

    Sólo el timeout da algunos problemillas, pero lo demás muy bien…

    Gracias Alex por orientarnos de una manera muy coloquial… fuera de todo tecnisismo aburrido…

    Un saludo Amigo…

  12. Ulises |

    Muchas gracias por tu codigo .. me saco de un apuro .. yo tenia mal lo del smtp .. pero con tu ejemplo ya salio … mil gracias ..

  13. Ivet |

    Hola!
    Soy nueva en esto de los hilos, y me gustaria saber si se puede ejecutar un timer con un hilo. Lo he intentado hacer pero no me sale.. En el metodo que manda a llamar pongo: “Timer.Enabled=True”, pero no inicia el timer. Es que teng tengo una interfaz y timers y los timers se alentan muchooo.. entonces queria ver si los timer los inicio con un hilo…. grs.
    Trabajo en Visual Studio 2008 (vb. NET)

    Saludos…

  14. Alex |

    Ivet:
    Checa que tengas la linea que dice: checkforillegalcrossthreadcalls=false para que no te de errores y despues en el lugar donde controlas los errores (try,catch,End Try) que tengas algun mensaje de error definido porque a lo mejor se esta saltando hacia alli.

  15. ADEC |

    Tengo el siguiente problema, cuando estoy conectado a internet directamente todo ok , pero al conectarme por proxy, no lo envia, que tengo que configurar o cambiar en tu codigo.
    Gracias.

  16. Alex |

    Adec: Probablemente el servidor proxy no admite envio de correo por obvias razones.

  17. ADEC |

    En este caso donde puedo verificar esto, o como hago por codigo para sabrelo y cambiarlo.
    Gracias.

  18. ADEC |

    Te comento que el correo de la empresa es de gmail y lo que necesito es que desde una aplicacion que se desarrollo me envie via mail unas alertas o respuestas a los usuarios que uno considere o parametrice. Aca todos los pc que estan el dominio envian sus mail y estan conectados a internet por medio del proxy. Que debo configurar de verdad necesito ayuda uregente.
    Gracias

  19. Alex |

    Pero el correo de tu empresa usa la pagina Web de Gmail que trabaja a traves del puerto 80 el cual esta abierto ya que tu proxy es un proxy HTTP y el protocolo que usa este programita es el SMTP y POP asi que no conozco la manera de que funcione a traves de proxy. Se me hace imposible.

  20. Roberto |

    Hola Alex,

    Necesito hacer lo mismo pero en web, me podrias enviar un ejemplo en VB.net o C#.net, mi problema es que envio los msg pero si el mail destino no existe no retorna un mail de error en el mail principal

  21. TOMY |

    no tengo cuenta en gmail, que lineas tengo que modificar y que tengo que poner para poder enviar un correo a mi bandeja de entrada en hotmail gracias de antemano.

  22. Alex |

    Hotmail no permite este tipo de envio de correo.

Escribe un comentario