tiempo de espera para el método en el hilo de la interfaz de usuario
-
03-07-2019 - |
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
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
.