是否有人像我一样经历过同样的错误: 情况: - 我在我的窗口应用程序中使用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;重新启动。
我找到了一些非常相似的问题,但没有明确答案。 对我有什么建议吗?
全部谢谢!
答案 0 :(得分:2)
破坏者是邪恶的。
严重的是,如果你没有发布一些非托管资源(非常罕见),你不应该在C#中使用析构函数。您的方案中的方法是引入或覆盖Dispose
方法形式IDisposable
接口并在那里取消注册。请注意,Dispose
方法不会像析构函数那样自动*调用。您需要确定代码中您认为mainform
不再相关的地方并在那里调用它。如果它是Window
派生类,那么您可以尝试在OnClose
事件中删除处理程序。
另一方面,如果这是一个关闭的主窗口然后关闭应用程序那么为什么要打扰。
*正如Dtex MVVMLight所指出的那样可能就是这样。