Aquí hay un esquema bastante estándar para el procesamiento de fondo asincrónico en VB6. (Por ejemplo, está en Dan Appleman's book y Microsoft VB6 samples). Usted crea un EXE de ActiveX separado para hacer el trabajo: de esa manera el trabajo se realiza automáticamente en otro hilo, en un proceso separado (lo que significa que no tiene que preocuparse por variables pisoteadas).
- El objeto EXE ActiveX VB6 debe exponer un evento CheckQuitDoStuff(). Esto toma un booleano ByRef llamado Salir.
- El cliente llama a StartDoStuff en el objeto EXE de ActiveX. Esta rutina inicia un temporizador en un formulario oculto y devuelve inmediatamente. Esto desbloquea el hilo de llamada. El intervalo del temporizador es muy corto, por lo que el evento del temporizador se dispara rápidamente.
- El controlador de eventos Timer desactiva el temporizador y luego vuelve a llamar al método DoStuff del objeto ActiveX. Esto comienza el procesamiento largo.
- Periódicamente, el método DoStuff plantea el evento CheckQuitDoStuff. El controlador de eventos del cliente verifica la bandera especial y establece Salir verdadero si es necesario abortar. Entonces DoStuff aborta el cálculo y regresa temprano si Quit es verdadero.
Este esquema significa que el cliente no necesita ser multiproceso, ya que el hilo de llamada no se bloquea mientras está ocurriendo "DoStuff". La parte difícil es asegurarse de que DoStuff plantea los eventos a intervalos apropiados, demasiado tiempo, y no se puede abandonar cuando se quiere: demasiado corto, y se está desacelerando DoStuff innecesariamente. Además, cuando DoStuff se cierra, debe descargar el formulario oculto.
Si DoStuff realmente logra hacer todo esto antes de ser cancelado, puede plantear un evento diferente para decirle al cliente que el trabajo ha finalizado.
Eso es VB6, no vb.net. – GSerg
Creo que estabas desanimado porque dijiste que estaría "mejor usando un hilo separado". – MusiGenesis
de acuerdo, y corregido. – TheSoftwareJedi