イベントハンドラがガベージコレクション操作にどのように影響するかについて完全に混乱しています。イベントハンドラがCLRのガベージコレクションに影響する
オブジェクトがa1のガベージコレクションにより収集されない理由、例えば、(A1のデストラクタを呼び出していない):
デストラクタは、ガベージコレクタによって呼び出されていなくてもtimeChangeなeventHandlerを退会した後。
よろしくお願いいたします。要約する
public class B
{
private void button1_Click(object sender, EventArgs e)
{
A a1 = new A();
a1.timeChange += A1_timeChange;
a1.Start();
a1 = null;
GC.Collect();
}
private void A1_timeChange(object sender, EventArgs e)
{
MessageBox.Show(((DateTime)sender).ToString());
}
}
public class A
{
~A()
{
MessageBox.Show("A Collected");
}
public void Start()
{
if (timeChange != null)
{
Task.Factory.StartNew(() => {
while (true)
{
timeChange(DateTime.Now, null);
System.Threading.Thread.Sleep(3000);
}
});
}
}
public event EventHandler timeChange;
}
このタスクは 'this.timeChange'メンバで参照を保持し、未定義になると悲惨です。 while(true)ループは、それが永遠に参照されていることを保証します。イベントを静的に静的にすると、収集されたイベントが表示されます。 –