Título: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: Lekim en 19 Octubre 2015, 01:13 am Hola
Hola me gustaría saber como salir de la aplicación cuando todavía no se a salido de DO/LOOP Mi método clásico siempre ha sido poner END en el evento Unload en VB y también en Dispose en Net. No se si habrá otra manera también sencilla. Por ejemplo he creado un Bucle Do/Loop en el que creo un reloj en el cual si han pasado 10 segundos se sale de del bucle. La razón es porque quiero que el bucle dure un mínimo de 10 segundos a espera que se cumpla una condición y si pasados los 10 segundos no se cumple sale del bucle. Aquí va el supercódigo de ejemplo :P Código
El problema está en que si quito Código
No se puede cerrar la apliación hasta que no pasen los 10 segundos Título: Re: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: El Benjo en 19 Octubre 2015, 06:41 am Lo puedes hacer de varias maneras, la más sencilla es mediante una variable que le diga al loop si la aplicación se ha cerrado, cambiando el estado de esta variable cuando se esté cerrando el form:
Código
También puedes hacerlo usando un hilo independiente, pero necesitarías utilizar delegados y usar la propiedad InvokeRequired y la función Invoke() del formulario. Espero que el primer método te sirva. Título: Re: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: Eleкtro en 19 Octubre 2015, 13:33 pm Terminar la ejecución de la aplicación de forma anómala usando el keyword End es algo que se debe evitar a toda costa, de todas formas en el handler donde indicas esa orden es normal que no te funcione como esperas.
Lo que deberías hacer es lo que ha comentado @El_Benjo al final de su comentario. Puedes utilizar un BackgroundWorker o mejor una Task con un token de cancelación en el cual realizarías una petición de cancelación al cerrar el form. Aparte de eso, deberías reemplazar el uso de TimeSpan por un StopWatch, ya que la medida es más precisa y su utilización más simple. Saludos Título: Re: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: Lekim en 19 Octubre 2015, 23:41 pm Gracias los dos ;-)
No estoy seguro que opción es mejor pero creo que por sencillez me decanto por usar la variable boleana. He aprovechado para realizar un experimento de velocidad de los procesos dentro del bucle, para este ejemplo, que imagino que según el ordenador los resultados será distinto. Código
Esta sería la otra forma, aunque más compleja y que me ha costado encontrar. Código
De esta última forma usando Task e Invoke como habéis dicho el programa se cierra sin problemas. Me ha costado averiguar también como llamar a un control externo dentro de un subproceso, ya que si llamaba diréctamente obtenía error. La forma era la siguiente: Código
También: Código
En cuanto a la eficiencia creo que es lo mismo porque me dan resultados idénticos, me refiero al experimento. Si el ordenador es al menos normalito, debería salir del bucle antes de los 10 segundos. Saludos Título: Re: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: Eleкtro en 21 Octubre 2015, 07:42 am En caso de que hayas optado por utilizar la alternativa de la Task, ten en cuenta como dije que la forma en la que lo debes hacer es asignándole un token de cancelación, cuyo nombre sirve para cancelar la tarea evidentemente, entonces lo usas y seguidamente utilizas el método Task.Wait para esperar a que la tarea finalice su cancelación antes de cerrar/liberar el form, de lo contrario se lanzará una excepción de tipo ObjectDisposedException al intentar invokar el control cuando ya ha sido liberado.
No es que sea muy importante ya que la excepción ocurrirá en el thread secundario, es decir, no saltará un mensaje de error ni nada en el thread de la UI, la excepción la podrás ver al depurar la app pero el form se cerrará como estaba previsto sin mostrar nada, de todas formas lo comento por que siempre es buena costumbre intentar evitar o controlar cualquier excepción que podamos preveer con antelación, en la medida de lo posible. Saludos! Título: Re: Cerrar aplicación mientras ser reproduce un bucle Do/Loop Publicado por: Lekim en 21 Octubre 2015, 09:54 am Ok Elektro :)
Encontré lo que comentas aquí. Lo probaré cuando pueda. CANCELACIÓN DE SUBPROCESOS ADMINISTRADOS (https://msdn.microsoft.com/es-es/library/dd997364(v=vs.110).aspx/) Saludos |