1

有没有人像我一样遇到同样的错误:情况:-我在我的窗口应用程序中使用 MVVMLight v4:-我有一个窗口窗体:例如 mainform-在代码隐藏类(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()

当我删除解构器时,不会引发异常。&当抛出异常时,我的视觉工作室也崩溃了->重新启动。

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

谢谢大家!

4

2 回答 2

3

析构函数是邪恶的。

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

另一方面,如果这确实是一个关闭的主窗口,然后应用程序也关闭了,那何必呢。

*如 Dtex MVVMLight 所述,可能会这样做。

于 2012-12-17T11:36:53.077 回答
0

如果您查看错误消息并复制错误 [以红色圈出],您将获得有问题的 Sub 或 Function 以及导致错误的原因。

如果您查看我的消息,它位于 Sub libRP_AcctNo.clsFindAcctNo.Finalize() 中,而违规行是 System.Data.OleDb.OleDbConnection.Close。当我从 Finalize 中删除这些行时,错误神奇地消失了。

于 2022-01-27T16:36:16.440 回答