32719


現在、以下の環境でWindowsアプリを作成しています。

  * フレームワーク: .NET Framework 4.5.2
  * 言語: C#
  * ターゲットPC: Windows10 x64

そこで、掲題の件について質問です。  
以下の様なコードでタイマを登録しているのですが、どうも2,3時間程度稼働してからタイマが止まっているようなのです。  
ガベージコレクタかな？と思ったのですが、「GC.KeepAlive()」とtimers変数にタイマインスタンスを登録しています。

[code]

    using System.Timers;
    
    public class TimerSample {
        private static List<Timer> timers = new List<Timer>();
    
        private static void schedule() {
            var timer = new Timer();
            GC.KeepAlive(timer);
            timers.Add(timer);
            // タイマの設定処理...
            timer.Start();
        }
    }
    
[/code]

例えば、KeepAliveがうまく効いていないとしたときに、インスタンスの参照を維持する為に行った、timers変数（List）へのタイマインスタンスはGC回避に有効でしょうか。  
Listの要素については参照されているとみなされずGCされてしまうでしょうか。


CC BY-SA 3.0
2017-02-16T08:24:03.773
32718
2017-02-16T08:32:22.823
15316
question
c# .net windows-10
C#におけるListの要素に対するGCの扱いについて


`GC.KeepAlive`はインスタンスの寿命を`KeepAlive`メソッド呼び出しまで保証するものですので、事前に呼ぶのは誤りです。

一方`List<T>`に登録されているインスタンスは`List<T>`自体が参照されている限り有効です。この場合は`static`フィールドですので、基本的にはアプリケーション終了まで参照され続けるはずです。


CC BY-SA 3.0
2017-02-16T08:32:22.823
32719
2017-02-16T08:32:22.823
5750
32718
answer