Visual Studio 2008 ContextSwitchDeadLock Log4NetとNhibernateを使用しています
-
27-09-2019 - |
質問
私はここで非常に奇妙なバグに直面しています、そして、私がそれを解決するための正しい道をたどるのか、それを解決する方法さえあっているのかどうか本当に確信がありません。
私が直面している問題は次のとおりです。Log4Net、Nhibernate、LinqをNhibernateに使用するWPFアプリケーションのデバッグを開始し、データベースからエンティティをアプリケーションから取得しようとすると、時には多くの時間ハングします。しばらくの間、例外ダイアログが開き、ContextSwitchDeadLock MDAに次の情報を含むメッセージを表示します。
CLRは、COMコンテキスト0x34FC1A0からCOMコンテキスト0x34FC258に60秒間移行することができませんでした。目的地のコンテキスト/アパートを所有するスレッドは、おそらく、ポンプなしの待機をしているか、Windowsメッセージをポンプすることなく非常に長い実行操作を処理する可能性があります。この状況は一般に、パフォーマンスの影響に負の影響を与え、アプリケーションが非応答性またはメモリの使用状況が時間の経過とともに継続的に蓄積されることにさえつながる可能性があります。これを避けるため
コードファイルを新しいプロジェクトにコピーし、古いプロジェクトを削除して、このメッセージを消滅させることができるかどうかを確認しました。何が原因であるかを確認するために、一度にいくつかのものを追加し始めました。LOG4NET構成コードを含めたとき、バグは再び表示されました。最初に、AssemblyInfoと後のTrough Code Configurationを介してそれを含めました。
だから、ここに私の発見があります:
- Log4Netを使用している場合にのみ発生します。
- Nhibernateがデータベースからエンティティをロードすると発生します(レイジーロード)。
このバグの原因が何であるかわかりません。 Visual Studioでデバッグするときにのみ発生します。次のページの「MDASの有効化と無効化」セクションの手順に従ってみました。 http://msdn.microsoft.com/en-us/library/d21c150d.aspx, 、しかし、それもうまくいきません。vsはまだハングしており、メモリの使用量が増加します。
私がプログラムを通常実行するとき、これはどれも起こらないので、この質問が示唆しているように、これはデッドロックの状況ではないと確信しています。 ContextSwitchDeadLock (そこに投稿されたソリューションも試しました)。
そのため、アプリを展開するときにLog4Netを無効にし、再度有効にすることにしました。
私はこの質問を投稿して、他の誰かがこのバグに直面しているかどうか、または誰かがそれを解決する方法についていくつかの提案を持っているかどうかを調べます。最後に、これがまったく同じ問題に直面している他の誰かを助けるかもしれません。
前もって感謝します、
ホルヘバルガス。
解決
DebugAppenderを使用すると、データベース内のすべてのエンティティがロードされ、すべてのデータがデバッグ出力に書き込まれます。それは、走るのに60秒以上かかったので、コンテキストSwitchDeadLock MDAを引き起こしていました。
DebugAppenderを無効にすると、私の問題が解決しました。
ヒントをくれたMauricio Schefferに感謝します。