Pregunta

Tengo un hilo que pasa eso lo inicializar la siguiente manera:

Utility.Log("1");

myThread = new Thread(new ThreadStart(delegate
{
    Utility.Log("2");

y luego el resto de la ejecución del hilo. Lo extraño es, a pesar de todo eso está envuelto en un try / catch, sólo estoy viendo un 1 en el archivo de log (n ° 2), y yo estoy poniendo un System.IO.FileLoadException no controlada. He intentado también envolviendo todo el cuerpo del delegado en un try / catch, pero sigo teniendo esa excepción, y el Visor de sucesos está diciendo que la parte superior la mayoría método de la excepción es que el método. Es muy extraño.

¿Alguna idea de cómo puedo realizar un seguimiento de esto abajo, o al menos para capturar adecuadamente la excepción?

¿Fue útil?

Solución

A FileLoadException es un accidente bastante serio. Se levantó cuando el compilador JIT intenta compilar el código que se ejecuta en su hilo. Un par try / catch no puede detectar esta excepción, ya que se eleva antes el código comienza a ejecutar. En otras palabras, bombardea antes se introduce el bloque try. Teniendo en cuenta que este es un hilo, no se puede detener su programa de estrellarse en el escritorio. El último suspiro que tienes es AppDomain.UnhandledException, propiedad InnerException del e.ExceptionObject le dice lo que está pasando realmente mal.

Esta excepción debe ser de otro modo siempre fácil solución. Es un problema de configuración, el compilador JIT encuentra un ensamblado que tiene el número de versión es incorrecta o una versión antigua de la asamblea, algo por el estilo. Si no se puede diagnosticar desde AppDomain.UnhandledException entonces la herramienta Fuslogvw.exe le puede mostrar cómo se está encontrando el mal montaje. Una reconstrucción completa de su solución debe ser a medio camino de una solución.

Otros consejos

Sólo se hizo publicar una parte de su código, por lo tanto, es casi imposible para responder a su pregunta. Así que aquí hay un consejo general.

No utilice los métodos anónimos para las discusiones. Es muy fácil de hacer algo mal y excepciones no capturadas en las discusiones pueden traer su aplicación hasta su conjunto.

public void MyMethod()
{
    _myThread = new Thread(WorkerThread);
    _myThread.Start();
}

public void WorkerThread(object state)
{
    try
    {
      Utility.Log("2");
    }
    catch (Exception e)
    {
       //log error
    }
}

El try..catch original, no será definitivamente capturar excepciones en su nuevo tema, sólo en el hilo de origen.

Si quieres trabajar de lo que está pasando en el hilo hijo, tendrá que darle su propio manejo de excepciones. Suena como que ha intentado hacer esto por "He intentado también envolviendo todo el cuerpo del delegado en un try/catch", pero se necesitaría que el código alterado para confirmar su exactitud.

También debe ser capaz de reducir este por la depuración en la rosca niño.

Usted necesita agregar un controlador de eventos excepción hilo:

Sólo tiene que añadir el manejador antes application.run y se puede capturar todas las excepciones de rosca no controlada.

Fuente de MSDN:

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms errors to go through
    // our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

http://msdn.microsoft. com / es-es / library / system.windows.forms.application.threadexception.aspx

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