2012-04-09 3 views
4

私はSystem.Threading.Timerを使用して定期的に関数を実行しようとしています。関数を呼び出しますが、機能しないため、エラーは報告されません。どうして?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(); 
    } 
} 
+7

@mellamokbを実行する必要がなく、非常に迅速にそのようなことを確認することができますとの自由LINQPadをインストールをお勧めします:なしありそのようなメソッドは 'System.Threading.Timer'クラスにあります。 'System.Threading.Timer'を構築するだけで十分です。とても急いではいけません。あなたのコメントをアップアップしたすべての人は、評判ポイント100点をドッキングする必要があります。 – jason

+0

コードが正常に動作するはずです - コールバックにブレークポイントを設定しようとしましたか? – BrokenGlass

+0

@Jason:いいですよ! :Pコメントが正しく削除されました。 – mellamokb

答えて

2

これは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"); 
    } 
} 

私はあなたがあなたのアプリケーション全体

+1

あなたがやっていることは、私が私の答えで尋ねた質問の自然な成果であるコードを彼に投げ捨てることです。それは彼に何も教えていない。 – jason

+0

@Jason - いいえ、私がしているのは、彼自身の問題を解決するツールを彼に与えることだけです。私は彼の問題を切り分けるために小麦を籾殻から分離する方法も彼に示しています。しかし、あなたは彼がおそらくほとんど知らない抽象的な概念に彼を混同しており、それらに沿ってゼロコードを提供しています。 –

+0

@ leventkalay92私は 'Thread.Sleep'コールを追加しました。コールバックが呼び出されるまでプロセスが生きています。(つまり、いくつかの" Hello "プリントアウトが表示されます) –

1

Timerrのインスタンスを作成しましたか?そのインスタンスでRunに電話しましたか?タイマーがGCされないようにそのインスタンスを保持しましたか(System.Threading.Timerは、System.Timers.Timerのように自動的にルーツされません)?タイマーコールバックが呼び出されるのを待っている間、あなたのプロセスを生き生きとした状態に保つためにいくつかのビジーなループや他の方法がありますか?

+0

私はこのコード以外は何もしなかった – leventkalay92

+1

@ leventkalay92、ジェイソンはあなたのコードを動作させるためにこれらのことをすべて行う必要があることを暗示しています。 –

+2

それは問題です。あなたは私が提案したことをする必要があります:あなたの 'Main'ループで' Timerr'をインスタンス化する必要があり、 'Timerr'で' Run'を呼び出す必要がある場合、インスタンスがGCedを途中でGCされていないことを確認する必要がありますコールバックがタイマーによって起動されるように、プロセスを生かしておく必要があります。私はあなたが初期のC#開発者だと思う。これらのことが何を意味しているのか、自分でコードをダンプするのではなく、あなた自身でこれらのことをどうやって行うのかを自分で判断すれば、多くを学ぶでしょう。 – jason

関連する問題