お世話になります。
メインクラスでサブクラスのインスタンスを生成し、Dictionaryで保持し管理しようと考えています。
サブクラスにはTimerが存在し、そのTimerがタイムアウトした際にとある処理を行い、
その後メインクラスから引数として渡されたCallback関数を呼び出します。
コールバック関数が呼び出されたらメインクラスで保持しているDicitonaryから削除し、Dictionaryで持っているクラスは今使用しているサブクラスのみとしたいです。
以下、コード例です。(メインクラスのコンストラクタは適当です)
// メインクラス public class MainClass { private ConcurrentDictionary<int, SubClass> mClassMngDic = new ConcurrentDictionary<int, SubClass>(); private Timer mWaitTimer; public MainClass() { var subclass = new SubClass(1, CallbackFunc); mClassMngDic.TryAdd(1, subclass); mWaitTimer = new Timer(WaitTimerCallback, null, 10 * 1000, Timeout.Infinite); Console.ReadKey(); } private void WaitTimerCallback(object obj) { if (mClassMngDic.Count == 0) { mWaitTimer.Change(Timeout.Infinite, Timeout.Infinite); } } private void CallbackFunc(int index) { // Dicitonaryから消す SubClass subclass; mClassMngDic.TryRemove(index, out subclass); } // サブクラス private class SubClass { public delegate void CallbackFunc(int index); private CallbackFunc mCallback; private int mIndex; public SubClass(int index, CallbackFunc callback) { mIndex = index; mCallback = callback; new Timer(TimerCallback, null, 5 * 1000, Timeout.Infinite); } private void TimerCallback(object obj) { // 重い処理を実行① mCallback(mIndex); // 重い処理を実行② } }
質問したいのは以下です。
- サブクラスで処理している途中にメインクラスのDictionaryからサブクラスを削除した際、GCが発生した時にサブクラスのインスタンスが確保しているメモリは解放対象となるのでしょうか。
- 1の質問がYESの場合、サブクラスで処理している途中にメインクラスのDictionaryからサブクラスを削除したと同時にGCが発生し、メモリ開放が発生した際、Timerタイムアウト時の処理(TimerCallback)の続きの処理を実行できるのでしょうか。
- サブクラスで処理している途中にメインクラスのDictionaryからサブクラスを削除した際、Timerタイムアウト時の処理(TimerCallback)の続きの処理を実行できるのでしょうか。
色々なサイトを調べてみたのですが、答えを見つけることができませんでした。
ご存じの方、ご教示いただけませんでしょうか。
質問する際は何を何で作っているかを質問の一行目に書きましょう。(例: Windows OS で動くコンソール アプリを Visual Studio 2022 を使ってフレームワークを .NET Framework 4.8 として作っています・・・とか)
上の質問のコード、
var subclass = new SubClass(1, CallbackFunc);
mClassMngDic.TryAdd(1, subclass);
は実際と同じですか? MainClass のフィールド subclass に new SubClass(1, CallbackFunc) で生成した SubClass のインスタンスへの参照が保持され続けるのですか? たぶん実際は違うのではないかと思っているのですが・・・