Pregunta

Tengo el problema de que estoy creando una instancia de un objeto en el hilo de la interfaz de usuario (WinForms). Esta creación de objetos probablemente toma mucho tiempo, y me gustaría tener una especie de " tiempo de espera " para ese método (porque está bloqueando mi aplicación).

Los problemas que tengo son: 1. el objeto debe ser creado en el hilo de la interfaz de usuario 2. El objeto es un objeto extraño, y no tengo ningún acceso de origen, por lo que no puedo modificarlo.

Entonces, mi pregunta sería, si alguien tiene una idea creativa, si es posible crear una lógica que detenga el método de ejecución si se alcanza un tiempo de espera.

tia Martin

¿Fue útil?

Solución

Aquí hay una mala solución. Utilice un subproceso de trabajo en un temporizador para supervisar el subproceso de la interfaz de usuario. Si el temporizador transcurre antes de que se cree el objeto, haga que el subproceso de trabajo llame a Abort en el subproceso de la interfaz de usuario. Esto generará una ThreadAbortException en el subproceso de la interfaz de usuario que debe capturar. Las razones por las que esto es malo es porque puedes hacer que tu programa se cuelgue o se bloquee dependiendo de la sincronización sutil y las condiciones de la carrera para cuando se genere la excepción.

Un " más seguro " el método es hacer que el trabajador llame a Interrupción : esto generará una ThreadInterruptedException en el subproceso de la interfaz de usuario, pero solo cuando esté en el estado de WaitSleepJoin - si el hilo nunca se detiene, no se interrumpirá, pero al menos tampoco se bloqueará o dañará la memoria.

Otros consejos

En realidad no; especialmente si no tiene acceso a la fuente.

Incluso si pudiera, no es una buena idea interrumpir a la fuerza el código sin una buena razón, solo puede ocasionar problemas (fugas, bloqueos que se dejan bloqueados, etc.).

¿Tiene que ser el mismo hilo de la interfaz de usuario? ¿Podría generar un segundo hilo de interfaz de usuario para poseer este código? Obtiene un pequeño pelea, pero puede funcionar.

si está utilizando BeginInvoke, IAsyncResult tiene un controlador de espera en el que puede WaitOne (tiempo de espera) - desde el subproceso que no es de la interfaz de usuario.

Lamentablemente, en el tiempo de espera, no hay una forma clara de cancelar ese BeginInvoke, por lo que puede probar la solución de 1800 INFORMATION .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top