有没有人像我一样经历过同样的错误:情景:-我在我的windows应用程序中使用MVVMLight v4:-我有一个windows窗体:例如mainform - In代码隐藏类(mainform.xaml.cs),我有一个构造函数和一个解构函数:
public mainform()
{
Messenger.Default.Register<NotificationMessage>(
this,
msg =>
{
//// Do something
}
}
~mainform()
{
Messenger.Default.Unregister<NotificationMessage>(this);
}这些代码运行良好,但当窗体关闭时,将抛出异常: System.InvalidOperationException {"Handle is not initialized“。} Stacktrace:
at System.WeakReference.set_Target(Object value)
at System.Windows.Threading.Dispatcher.FromThread(Thread thread)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.IntDestroyWindow(HandleRef hWnd)
at MS.Win32.HwndWrapper.DestroyWindow(Object args)
at MS.Win32.HwndWrapper.Dispose(Boolean disposing, Boolean isHwndBeingDestroyed)
at MS.Win32.HwndWrapper.Finalize()当我删除解构函数时,没有抛出异常。当抛出异常时,我的visual studio也会崩溃->重启。
我找到了一些非常相似的问题,但没有明确的答案。对我有什么建议吗?
谢谢大家!
发布于 2012-12-17 19:36:53
析构函数是邪恶的。
严格地说,如果不释放一些非托管资源(这种情况非常非常罕见),就不应该在C#中使用析构函数。在您的场景中,方法是从IDisposable接口引入或覆盖Dispose方法,然后在那里取消注册。注意,Dispose方法不会像析构函数那样被自动调用。您需要确定代码中您认为mainform不再相关的位置,并在那里调用它。如果它是一个Window派生类,那么您可以尝试在OnClose事件中删除处理程序。
另一方面,如果这真的是一个关闭的主窗口,然后应用程序也被关闭了,那么为什么还要麻烦呢。
*正如Dtex所指出的,MVVMLight可能就是这样做的。
发布于 2022-01-27 16:36:16
如果您查看错误消息并复制红色圈出的错误,您将得到有问题的Sub或Function以及导致错误的线索。
当我从Finalize中删除这些行时,错误神奇地消失了。
https://stackoverflow.com/questions/13912718
复制相似问题