Ayúdame a analizar esta pila de llamadas para ver qué está llamando mi método
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
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.