4

を使用して、関数を定期的に実行しようとしていSystem.Threading.Timerます。関数を呼び出しますが、機能せず、エラーを報告しません。なんで?

 public class Timerr
 {
    ArrayList listurl;
    ArrayList listcategory;
    protected Collection<Rss.Items> list = new Collection<Rss.Items>();
    RssManager reader = new RssManager();
    System.Threading.Timer Timer;
    System.DateTime StopTime;
    public void Run()
    {
        StopTime = System.DateTime.Now.AddMinutes(1);
        Timer = new System.Threading.Timer(TimerCallback, null, 0,1000);
    }

    private void TimerCallback(object state)
    {
        if (System.DateTime.Now >= StopTime)
        {
            Timer.Dispose();
            return;
        }
        callrss();
    }
}
4

2 に答える 2

1

のインスタンスを作成しましたTimerrか?Runそのインスタンスを呼び出しましたか?タイマーがGCされないように(System.Threading.Timersのようにsが自動的にルート化されないようSystem.Timers.Timerに)、そのインスタンスを保持しましたか?ビジーループ、またはタイマーコールバックを呼び出すのに十分な時間プロセスを存続させる他の方法がありますか?

于 2012-04-09T15:56:28.620 に答える
1

これはLINQPadで機能します。

void Main()
{
    var t = new Timerr();
    t.Run();

    Thread.Sleep(60000);
}

public class Timerr
 {
    System.Threading.Timer Timer;
    System.DateTime StopTime;
    public void Run()
    {
        StopTime = System.DateTime.Now.AddMinutes(1);
        Timer = new System.Threading.Timer(TimerCallback, null, 0,1000);
    }

    private void TimerCallback(object state)
    {
        if (System.DateTime.Now >= StopTime)
        {
            Timer.Dispose();
            return;
        }
        Console.WriteLine("Hello");
    }
}

アプリケーション全体を実行しなくても、このようなことをすばやく確認できる無料のLINQPadをインストールすることをお勧めします。

于 2012-04-09T16:05:04.440 に答える