Pregunta

Ok, por lo que tienen una forma muy simple con junto a ninguna lógica en ella que está controlado por por un presentador. Hay un método en él Restablecer public void () que restablece el formulario a su estado inicial. Esta debe ser llamado sólo por el presentador y en casos muy específicos (tales como un tiempo de espera de actividad). Estoy corriendo en un problema, sin embargo, donde en pocos casos extremos (Cuando estoy simulando mi solicitud perder la conectividad de base de datos, por ejemplo) el método reset () está recibiendo llamadas cuando no debería ser y no puedo averiguar por qué .

Por lo tanto, establecer un punto de rastreo en el método Reset () y hacer que imprima la pila de llamadas. Por extraño que parezca que eleva aún más preguntas. ¿Puede alguien ayudarme a averiguar donde la llamada a reset () se viene? Mi pila de llamadas está por debajo.

Una cosa que debería explicar es DriverInterface2.UI.WinForms.NonInheritingForms.CheckInForm que se puede ver en la pila de llamadas. Esa es una aplicación muy sencilla de ICheckInForm (la interfaz relavant) y simplemente crea CheckInForm y delega en él. Es allí sólo porque estoy usando el castillo de Windsor y el cableado de las clases que heredan de la Forma obtiene terrible desordenado. En cualquier caso, el contenido completo de este método es la siguiente:

public void Reset() {_form.Reset();}

Y aquí está la pila de llamadas:

Function: DriverInterface2.UI.WinForms.CheckInForm.Reset(), 
Thread: 0xA96F4 Main Thread, 
Caller: DriverInterface2.UI.WinForms.NonInheritingForms.CheckInForm.Reset, 
Callstack:  DriverInterface2.UI.WinForms.dll!DriverInterface2.UI.WinForms.CheckInForm.Reset
    DriverInterface2.UI.WinForms.dll!DriverInterface2.UI.WinForms.NonInheritingForms.CheckInForm.Reset
    [Native to Managed Transition]
    [Managed to Native Transition]
    mscorlib.dll!System.Delegate.DynamicInvokeImpl
    System.Windows.Forms.dll!System.Windows.Forms.Control.InvokeMarshaledCallbackDo
    System.Windows.Forms.dll!System.Windows.Forms.Control.InvokeMarshaledCallbackHelper
    mscorlib.dll!System.Threading.ExecutionContext.runTryCode
    [Native to Managed Transition]
    [Managed to Native Transition]
    mscorlib.dll!System.Threading.ExecutionContext.RunInternal
    mscorlib.dll!System.Threading.ExecutionContext.Run
    System.Windows.Forms.dll!System.Windows.Forms.Control.InvokeMarshaledCallback
    System.Windows.Forms.dll!System.Windows.Forms.Control.InvokeMarshaledCallbacks
    System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc
    System.Windows.Forms.dll!System.Windows.Forms.ScrollableControl.WndProc
    System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.WndProc
    System.Windows.Forms.dll!System.Windows.Forms.Form.WndProc
    System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage
    System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc
    System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback
    [Native to Managed Transition]
    [Managed to Native Transition]
    System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop
    System.Windows.Forms.dll!System.Windows.Forms.Application.Run
    DriverInterface2.exe!DriverInterfaceRunner.Program.Main
    [Native to Managed Transition]
    [Managed to Native Transition]
    mscorlib.dll!System.AppDomain.ExecuteAssembly
    Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context
    mscorlib.dll!System.Threading.ExecutionContext.Run
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart
¿Fue útil?

Solución

A mi me parece como un mensaje de Windows está siendo marshalled a un evento de .NET, y ese evento está llamando a su método Reset. Cuyo caso es, no sé. Si no es un evento, entonces podría ser un delegado asincrónica.

Si eres método Reset se llama desde un evento Application.Idle, eso podría explicarlo.

La llamada que llevó al delegado asincrónica para ser elevado (controlador de eventos o de otra manera) no aparecerán en la pantalla como la llamada es asíncrona. Por lo tanto, la pila puede desentrañar a partir de esa llamada antes de que el sistema planifica que el delegado a través del suministro de mensajes de Windows. Por lo tanto, la llamada original ya no está presente en la pila.

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