首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Destructor make错误中的注销消息({"Handle is not initialized."})

Destructor make错误中的注销消息({"Handle is not initialized."})
EN

Stack Overflow用户
提问于 2012-12-17 18:52:14
回答 2查看 3.3K关注 0票数 1

有没有人像我一样经历过同样的错误:情景:-我在我的windows应用程序中使用MVVMLight v4:-我有一个windows窗体:例如mainform - In代码隐藏类(mainform.xaml.cs),我有一个构造函数和一个解构函数:

代码语言:javascript
复制
public mainform()
{
    Messenger.Default.Register<NotificationMessage>(
        this,
        msg =>
        {
           //// Do something
        }
}

~mainform()
{
    Messenger.Default.Unregister<NotificationMessage>(this);
}

这些代码运行良好,但当窗体关闭时,将抛出异常: System.InvalidOperationException {"Handle is not initialized“。} Stacktrace:

代码语言:javascript
复制
   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也会崩溃->重启。

我找到了一些非常相似的问题,但没有明确的答案。对我有什么建议吗?

谢谢大家!

EN

回答 2

Stack Overflow用户

发布于 2012-12-17 19:36:53

析构函数是邪恶的。

严格地说,如果不释放一些非托管资源(这种情况非常非常罕见),就不应该在C#中使用析构函数。在您的场景中,方法是从IDisposable接口引入或覆盖Dispose方法,然后在那里取消注册。注意,Dispose方法不会像析构函数那样被自动调用。您需要确定代码中您认为mainform不再相关的位置,并在那里调用它。如果它是一个Window派生类,那么您可以尝试在OnClose事件中删除处理程序。

另一方面,如果这真的是一个关闭的主窗口,然后应用程序也被关闭了,那么为什么还要麻烦呢。

*正如Dtex所指出的,MVVMLight可能就是这样做的。

票数 3
EN

Stack Overflow用户

发布于 2022-01-27 16:36:16

如果您查看错误消息并复制红色圈出的错误,您将得到有问题的Sub或Function以及导致错误的线索。

当我从Finalize中删除这些行时,错误神奇地消失了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13912718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档