Pregunta

Estoy usando C # con marco compacto 2, SP2.

El sistema operativo del dispositivo se configuró para iniciar con mi solicitud, llamemos a la aplicación "loader.exe".

Loader es simplemente esto: una forma única y simple que muestra los mensajes de estado durante la carga, si es necesario (los términos de Layman para que hay un error y un mensaje de excepción, o "Aplicación de inicio [XYZ]"), y una máquina de estado que se ejecuta. en el fondo mientras se muestra un formulario básico de pantalla completa.

Por lo tanto, el constructor de la forma del cargador tiene lo siguiente en el extremo muy :

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}

y "runstatemachine" funciona en un hilo diferente a la UI, lo que permite que se muestre el formulario, y en cualquier momento, RUNSTATEMACHINE debe interactuar con el formulario, como la actualización de los mensajes, llamo a una función que usa si (esto.invokereRequired ) {este.invoke (...);} else {...}

Entonces, mi problema?
De forma intermitente, mi programa se colgará, y es porque el temporizador no activó una devolución de llamada. Añadí en el mensaje de depuración en el bloque de prueba anterior, junto con muchos otros lugares para decirme dónde colgó, incluido un mensaje al inicio de "Runstatemachine". Finalmente, mi programa colgó en el mensaje "Inicio GUI Init Hilo ..."

Esto me dice que el temporizador de rosca no está ejecutando el tiempo uno , lo necesito.
Mi teoría es que se está recolectando basura antes del temporizador que activa la devolución de llamada. Eso significaría si el temporizador fuera global, y luego se dispara explícitamente cuando llegue a RunstateMachine, que se ejecutará perfectamente ... pero no quiero pensar que lo resolví solo para encontrar esto de manera intermitente un mes a partir de ahora.

pensamientos?

¿Fue útil?

Solución

Mi teoría es que se está recolectando basura antes del temporizador desencadenando la devolución de llamada.Eso significaría si el temporizador fuera global, y Luego se dispone explícitamente cuando llego a RunStatemachine, que lo hará. corre perfectamente ... pero no quiero pensar que lo resolví solo para encontrar Esto acerca intermitentemente un mes a partir de ahora.

Parece que quieres confirmación de que este es tu problema. Sí, este es el problema.

El temporizador se almacena en una variable local que nunca se usa nunca.Esto lo hace elegible para GC.El GC'ing del temporizador conduce a la finalización que lleva al temporizador para que se deshabilite.

Le sugiero que almacene el temporizador en un campo de instancia de su clase de formulario y elimínela desde allí una vez que la devolución de llamada haya disparado.

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