1

私のような同じエラーを経験した人はいますか: 状況: - ウィンドウ アプリケーションで MVVMLight v4 を使用しています:コンストラクターとデコンストラクターがあります。

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

デストラクタはEVILです。

管理されていないリソースを解放しない場合は、C#でデストラクタを使用しないでください(非常にまれです)。シナリオに進む方法は、DisposeメソッドフォームIDisposableインターフェイスを導入またはオーバーライドして、そこで登録を解除することです。Disposeデストラクタのようにメソッドが自動的に呼び出されることはないことに注意してください*。mainformコード内で、関連性がなくなったと思われる場所を特定し、そこで呼び出す必要があります。派生クラスの場合は、イベントWindowでハンドラーを削除してみてください。OnClose

一方、これが実際に閉じられてからアプリケーションが閉じられるメインウィンドウである場合は、なぜわざわざする必要があります。

* Dtex MVVMLightが指摘しているように、それを行う可能性があります。

于 2012-12-17T11:36:53.077 に答える