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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top