Ajuda-me analisar este callstack para ver o que está chamando meu método
Pergunta
Ok, então eu tenho uma forma muito simples, com quase nenhuma lógica em que ela é controlada por por um apresentador. Há um método nele Redefinir public void () que redefine a forma ao seu estado inicial. Isto deve ser chamado somente pelo apresentador e em casos específicos, próprios (tais como um tempo limite de actividade). Eu estou correndo em um problema embora, onde em alguns casos extremos (Quando eu estou simulando o meu aplicativo de conectividade de banco de dados perdida por exemplo) o Reset () método está sendo chamado quando não deveria ser e eu não consigo descobrir por que .
Então eu configurar um tracepoint no método Reset () e tê-lo imprimir a pilha de chamadas. Estranhamente que levantou ainda mais perguntas. Alguém pode me ajudar a descobrir onde a chamada para Reset () está vindo? Meu callstack está abaixo.
Uma coisa que eu deveria explicar é DriverInterface2.UI.WinForms.NonInheritingForms.CheckInForm que você pode ver na pilha de chamadas. Essa é uma forma muito simples implementação de ICheckInForm (a interface relavant) e simplesmente cria CheckInForm e delegados a ele. É lá só porque eu estou usando o Castelo de Windsor e fiação até classes que herdam Form fica terrível bagunça. Em qualquer caso, o conteúdo completo de que o método é o seguinte:
public void Reset() {_form.Reset();}
E aqui está a pilha de chamadas:
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
Solução
Parece-me que uma mensagem do Windows está sendo comandada a um evento .NET e esse evento está chamando o seu método Reset. Qual evento que é, eu não sei. Se não é um evento, então ele poderia ser um delegado assíncrona.
Se você é Reset método é chamado de um evento Application.Idle, que pode explicá-lo.
A chamada que levou o delegado assíncrona para ser levantada (manipulador de eventos ou não) não aparecerá na pilha como a chamada é assíncrona. Portanto, a pilha pode desvendar de que a chamada antes que o sistema envia esse delegado por meio da bomba de mensagem do Windows. Portanto, o chamador original não está mais presente na pilha.