在析构函数中取消注册消息会产生错误({"句柄未初始化。"})

时间:2012-12-17 10:52:14

标签: wpf mvvm wpf-controls mvvm-light

是否有人像我一样经历过同样的错误: 情况: - 我在我的窗口应用程序中使用MVVMLight v4: - 我有一个窗体:如mainform - 在代码隐藏类(mainform.xaml.cs)中,我有一个构造函数&解构主义者:

public mainform()
{
    Messenger.Default.Register<NotificationMessage>(
        this,
        msg =>
        {
           //// Do something
        }
}

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

这些代码运行良好,但是当窗体关闭时,将抛出异常: System.InvalidOperationException {“句柄未初始化。”} 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()

当我删除解构函数时,不会抛出任何异常。 &安培;当异常抛出时,我的视觉工作室也崩溃了 - &gt;重新启动。

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

全部谢谢!

1 个答案:

答案 0 :(得分:2)

破坏者是邪恶的。

严重的是,如果你没有发布一些非托管资源(非常罕见),你不应该在C#中使用析构函数。您的方案中的方法是引入或覆盖Dispose方法形式IDisposable接口并在那里取消注册。请注意,Dispose方法不会像析构函数那样自动*调用。您需要确定代码中您认为mainform不再相关的地方并在那里调用它。如果它是Window派生类,那么您可以尝试在OnClose事件中删除处理程序。

另一方面,如果这是一个关闭的主窗口然后关闭应用程序那么为什么要打扰。

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