まず、背景として、System.Timer が起動したときにクロススレッド更新を実行しようとしています。コードの性質上、タイマーで SynchronizatoinContext を使用することは解決策ではありません。このパターンは、クロススレッドの更新に便利であることがわかりました
this.Invoke((MethodInvoker)delegate {
..lots of form update code here...
});
ただし、呼び出しごとに新しいスレッドが作成され、ガベージ コレクションが行われていないため、メモリ/スレッド リークが発生しているようです。
スタック オーバーフローで回答を検索したところ、矛盾する情報が見つかりました。このようないくつかのスレッドBeginInvoke メモリ リーク? EndInvoke が必要ではないと他の人が主張している場合に、EndInvoke が必要であると主張します。
私の質問は、正確に何が起こっているのか、どうすれば修正できますか?
更新:以下は、これがどのように機能するかの擬似コードです
Main Form
System.Timer -> Fires -> Calls UpdateForm() On Secondary Form
Secondary Form
UpdateForm()
{
this.Invoke((MethodInvoker)delegate {
..lots of form update code here for multiple controls..
});
}
プログラムでメモリ リークが発生しています。私の仮説では、このリークは無限にスレッドが作成されることが原因であると考えられます。