2016-07-14 19 views
0

ただ1秒の遅延の後にメソッドを実行しようとしています。
このメソッドは一度しか呼び出されません。TimerCallbackが1秒の遅延で呼び出されないC#

  1. Jon Skeet's answer
  2. MSDN example

私の現在のコード:

private void NetworkIsActive() { 
    // delay to allow the network to properly set firs 
    AutoResetEvent autoEvent = new AutoResetEvent(false); 
    TimerCallback timerDelegate = new TimerCallback(this.CheckInternetConnection); 
    TimeSpan delayTime = new TimeSpan(0, 0, 1); 
    try { 
     Timer updateTimer = new Timer(timerDelegate, autoEvent, delayTime, TimeSpan.FromMilliseconds(-1)); 
    } catch (ArgumentOutOfRangeException Ex) { 
     throw Ex; 
    } catch (ArgumentNullException NEx) { 
     throw NEx; 
    } catch (Exception x) { 
     throw x; 
    } 
} 

を、私は私が欲しいものを達成しようとするこれらの例に従っても無駄にしている

CheckInternetConnection ()

private void CheckInternetConnection(object state) { 
    switch (NetworkActivities.IsInternetAvailable()) { 
     case TRUE: 
      this.ExternalIP = NetworkActivities.getExternalIP(); 
      this.InternetConnection = ACTIVE; 
      break; 
     case FALSE: 
      this.ExternalIP = EMPTY; 
      this.InternetConnection = INACTIVE; 
      break; 
    } 
} 

私もnull状態引数を設定しようとしたが、違いはありませんしています。

CheckInternetConnectionが呼び出されることはありませんし、例外がtry...catch

にスローされません私はむしろ、この方法は作業になるだろう、私はThread.Sleep

答えて

3

Timerは自己維持ではありません - あなたはそれを参照しておく必要があります、または消えそうです。あなたの場合はローカルなので、メソッドが終了する前にコレクションの対象となります。

+0

参考にするのに最適なペースはどこですか?コンストラクタ? – wmash

+0

@wmashコンストラクタは '一時的にアクティブ'なので、コンストラクタは参照を保持できません。 – Maarten

+0

@Luaanクラスとタイマーがコールバックデリゲートを介して接続されているため、タイマーはコレクションに適格ではありません。 – Maarten

2

を使用しての賛成ではないですとあなたは(Timer.Startが欠けているように見えます)あなたのタイマーは起動しませんので、起動しないでください。

関連する問題