Помогите мне проанализировать этот стек вызовов, чтобы увидеть, что вызывает мой метод - PullRequest
0 голосов
/ 18 декабря 2008

Хорошо, у меня есть очень простая форма с почти отсутствующей логикой, которой управляет докладчик. В нем есть метод public void Reset (), который сбрасывает форму в исходное состояние. Это должно вызывать только докладчик и в очень специфических случаях (например, тайм-аут активности). Однако я столкнулся с проблемой, когда в нескольких крайних случаях (например, когда я симулирую, что мое приложение теряет связь с базой данных) вызывается метод Reset (), когда его не должно быть, и я не могу понять, чем .

Итак, я установил точку трассировки в методе Reset () и дал ей распечатать стэк вызовов. Как ни странно, это вызвало еще больше вопросов. Может ли кто-нибудь помочь мне выяснить, откуда поступает вызов Reset ()? Мой стек вызовов ниже.

Одна вещь, которую я должен объяснить, это DriverInterface2.UI.WinForms.NonInheritingForms.CheckInForm, который вы можете увидеть в стеке вызовов. Это очень простая реализация ICheckInForm (релевантный интерфейс), которая просто создает CheckInForm и делегирует его. Это происходит только потому, что я использую замок Виндзор, и проводка классов, которые наследуются от Form, становится ужасно грязной. В любом случае полное содержание этого метода таково:

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

А вот и стек вызовов:

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

1 Ответ

1 голос
/ 18 декабря 2008

Мне кажется, что сообщение Windows направляется в событие .NET, и это событие вызывает ваш метод Reset. Какое это событие, я не знаю. Если это не событие, то это может быть асинхронный делегат.

Если метод Reset вызывается из события Application.Idle, это может объяснить это.

Вызов, который привел к возникновению асинхронного делегата (обработчик события или иным образом), не будет отображаться в стеке, поскольку вызов является асинхронным. Таким образом, стек может распутать этот вызов до того, как система отправит делегирование через насос сообщений Windows. Поэтому исходный вызывающий объект больше не присутствует в стеке.

...