DataGridViewやToolStripsなどのWinformアプリケーションコントロールの一部がUserPreferenceChangedEventHandlersによって参照されています。コントロールのどのような設定によってそのような参照が生成されるのか、そのような参照によって私のコントロールがメモリ内に生き残るのはどうなのか分かりません。そのイベントからそのような参照を削除するにはどうすればよいですか?ありがとう。C#winformアプリケーションでUserPreferenceChangedEventHandlerとは何ですか?
答えて
SystemEvents.UserPreferenceChangedイベントのデリゲートタイプです。 WindowsがWM_SETTINGCHANGEメッセージをブロードキャストすると、このイベントが発生します。ユーザーがコントロールパネルのアプレットを使用してシステム設定を変更したときに、通常発生します。
いくつかのコントロールは、このイベント、DataGridView、DateTimePicker、MonthCalendar、ProgressBar、PropertyGrid、RichTextBox、ToolStrip、NumericUpDownのイベントハンドラを登録します。彼らは通常、フォントやキューの変更やレイアウトに影響を与えるものに興味があります。
SystemEvents.UserPreferenceChangedは静的イベントです。ハンドラを登録して登録抹消を忘れるとメモリリークが発生し、制御がガベージコレクションされなくなります。リストされたコントロールは、OnHandleDestroyed()メソッドまたはDispose()メソッドでイベントハンドラの登録を解除します。
これら2つの方法のどちらも実行しないと、問題が発生します。これは、コンテナのControlsコレクションからコントロールを削除し、Dispose()を忘れたときに発生します。 Dispose()を呼び出すことを忘れることは通常問題ではありませんが、コントロールの難しい要件です。忘れるのも簡単です。通常、コントロールはフォームによって自動的に処理されます。しかし、これはControlsコレクション内のコントロールに対してのみ発生します。
また、ShowDialog()メソッドで表示したフォームで、ダイアログの結果を取得した後にDispose()を呼び出すようにしてください。 usingステートメントは、それを処理する最善の方法です。
もう一つの耐え難いほどの詳細は、UserPreferenceChangedイベントに関する重要であり、それは多くの場合、あなたがワーカースレッドのコントロールを作成するときにアプリをデッドロックです。通常、ワークステーションがロックされているとき(Win + Lキーを押す)。私がリストアップしたコントロールを使用するときにはうまくいきませんが、SystemEventsクラスはUIスレッドでイベントを発生させようとしますが、複数のスレッドがそれらを作成したときに正しく実行できません。
また、永続的な影響を与える可能性のある種類のバグのようなスプラッシュ画面では、どのスレッドがあなたのUIスレッドであるかを間違って推測するSystemEventsクラスを取得できます。その後、間違ったスレッドでイベントが永続的に発生します。非常に醜いto diagnose、デッドロックはよく隠されています。
- 1. Winformアプリケーションでdllを使用するC#
- 2. C#WinFormアプリケーションのデバッグ
- 3. winformアプリケーションのthree.js C#
- 4. C#でwinformアプリケーションをプログラムで自動起動する方法は?
- 5. C#Winformアプリケーションのディスプレイはセカンダリモニタのみ
- 6. Protovisと.net winformアプリケーション
- 7. WinForm Stringsと同等のWPFは何ですか?
- 8. Winformとスレッド(C#)
- 9. C#.NET WinformアプリケーションからのSQL Serverでのクエリの反復
- 10. アプリケーションでは、「アプリケーションプロセス」とは何ですか?
- 11. Winformアプリケーション(C#)用の「Excelコントロール」はありますか?
- 12. SilverlightでWinform Control.Handleに相当するものは何ですか?
- 13. ツールボックスのコントロールをWinformアプリケーションとWPFアプリケーションの両方で使用できますか?
- 14. c#winformアプリケーションで未使用のリソースを廃棄するGLOBALLY
- 15. c#winformバックグラウンドワーカーとプログレスバー
- 16. C#Winform ProgressBarとBackgroundWorker
- 17. `printf`の%* c%* cとは何ですか?
- 18. C#ではString *とは何ですか?
- 19. C#WinForm何も起こらない
- 20. WinFormアプリケーションとMS Office参照
- 21. WinFormアプリケーションのNHibernateとAUTOFAC
- 22. c# - Winformとaspxアプリケーションの間のクラスを共有する
- 23. C#で別のwinformのwinformのパネルを使用できますか?
- 24. C++で_In_とは何ですか?
- 25. C#プログラムでThePreStubとは何ですか?
- 26. C++でvoidポインタとは何ですか?
- 27. C =で '=>'とは何ですか?
- 28. C#でCreateNewAttributeとは何ですか?
- 29. C#で "var"とは何ですか?
- 30. CプログラミングでLINT_ARGSとは何ですか?
ありがとうございます。コードをチェックしたところ、問題のあるコントロールがパネルのコントロールリストに追加され、パネルが別のパネルのコントロールリストに追加され、最後にルートパネルがフォームのコントロールリストに追加されたようです。メモリプロファイラーから、コントロールのdisposeメソッドが呼び出されたが、UserPreferenceChangedEventHandlerがまだハングしていることがわかります。これは私が理解していない部分です。私が逃したことは他に何かありますか? – Steve
しかし、答えに感謝します。私はそれを取る。 – Steve
Nice Answerスティーブが言及しているように、時にはコントロールを破棄しても、まだこの問題があります。この問題に関するいくつかのConnectエントリがあります:http://connect.microsoft.com/VisualStudio/feedback/details/469277/toolstrip-statusstrip-toolstriptextbox-visibility-and-userpreferencechangedeventhandler。 –