2

たとえば、タイマー関数を実行するスレッドがプログラムにあります

Thread PopMonitoringThread = new Thread(new ThreadStart(PopMonitoring));  
PopMonitoringThread.Start();

public static void PopMonitoring()
{
    TimerCallback callback = new TimerCallback(Tick);
    Timer stateTimer = new Timer(callback, null, 0, 1000);
}

//Timer method
static public void Tick(Object stateInfo)
{
    try
    {
        if (Properties.Settings.Default.BatchingMode > 0)
        {
            if (batchTime.Subtract(DateTime.Now) < TimeSpan.Zero)
            {
                batchTime = DateTime.Now.AddMinutes(Properties.Settings.Default.BatchingMode);
                Console.WriteLine("-----------------------------------------------------");
                Process();
                Console.WriteLine("Batch Process Run");
                Console.WriteLine("-----------------------------------------------------");
            }
            Console.WriteLine("{0}", DateTime.Now.ToString("h:mm:ss"));
        }
        Console.WriteLine("Pop3 Monitoring start after: {0}", batchTime.Subtract(DateTime.Now));
    }
    catch (Exception e)
    {
        throw e;
    }
}

Process()メソッドをコメントアウトすると、タイマーの相互作用は毎秒正常に機能しますが、TickメソッドからProcessメソッドのコメントを外すと、タイマーが機能しなくなります。つまり、Tickメソッドが機能しなくなります。プロセスメソッドコードは完全に機能しています。つまり、コンパイルエラーやランタイムエラーはありません。

4

1 に答える 1

3

作成しているスレッドは、呼び出しているかどうかに関係なく、ほぼ瞬時に停止しますProcess()。スレッドで行っているのは、タイマーを開始することだけです。実際のTickメソッドは、スレッドプールのバックグラウンドスレッドで実行されています。

stateTimerこれで、スコープから外れたため、ある時点でガベージコレクションが行われます。この時点で、タイマーはトリガーされなくなります。ほとんどの場合、このガベージコレクションは、電話をかけているときにはるかに早く発生しますProcess()

メソッドを呼び出すことGC.Collect()でテストできますTick。1、2ティック後に停止するのがわかります。

これを修正するにはstateTimer、メンバー変数を作成します。ものを失うThread

class Program
{
    private static Timer _stateTimer;

    static void Main(string[] args)
    {
        _stateTimer = new Timer(Tick, null, 0, 1000);
        Console.ReadLine();
    }

    static public void Tick(Object stateInfo)
    {
        // ...
    }
}

PS:このコードは実験を行っているためだと思いますが、キャッチした例外を再スローする場合は、throw;パラメーターなしで使用する必要があります。簡単な説明については、このブログ記事を参照してください。

于 2013-02-22T06:36:11.920 に答える