2011-06-23 13 views
4

GSMデバイスからSMSメッセージを読み取るクラスを作成したいとします。AutoresetまたはシングルスレッドのThreading.Timer?

毎秒着信メッセージを読み取るタイマー(system.threading)を作成しました。

 

public void ReadMessage(){ 
//read sms messages 
//and store it into the database 
} 
 

時にはReadMessage()が1秒以上かかります。タイマー は、前のタイマーがまだ終了していないときにこのプロシージャを呼び出さないようにするにはどうすればよいですか?
1. AutoResetEventWaitOneはこれに適していますか?
2. Threading.Timerは良い選択ですか?または私は単一のスレッドでそれを行う必要がありますか?

答えて

4

System.Timers.Timerを使用すると、操作が簡単になります。ハンドラの最後で、その後falseから
(それはThreading.Timer周りの友好のラッパーです)

設定AutoReset、再びStart()タイマー。

専用のスレッドは使用しないでください。 1秒ごとに目を覚ますことができるように何もしないでスレッドを維持することには意味がありません。

+0

System.Timers.Timerを使用するクラスのインスタンスを複数作成することはできますか?経過イベントはどうなりますか? – h3n

+1

@Fleents:各タイマーは独自のイベントを取得します。 – SLaks

+0

クール..ありがとう.. – h3n

1

明示的なタイマートリガーがまったく必要ないことがわかります。あなたはこれをオフにスレッド場合:

while(true){ 
    ReadMessage(); 
    Thread.Sleep(1000); 
}; 

これはまさにあなたがやりたいことではない..does、すべてがうまく1つのスレッドでカプセル化されましたか?

RGDS、 マーティン

+0

ありがとう、lnt3!ブロックをコードとしてフォーマットしていないとわかったのと同じように私は 'post'をクリックしました:(また、 'true'はスレッドの名前空間と同じように '1'よりも明瞭です。コード:) –

2

この質問はかなり古いですが、あなたはこのコードによって鼓舞することができます。追加スレッドは使用せず、コードの実行中に時間をカウントしません。

/// <summary> 
/// Single thread timer class. 
/// </summary> 
public class SingleThreadTimer: IDisposable 
{ 
    private readonly Timer timer; 
    private readonly Action timerAction; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="SingleThreadTimer"/> class. 
    /// </summary> 
    /// <param name="interval">The interval time.</param> 
    /// <param name="timerAction">The timer action to execute.</param> 
    /// <exception cref="System.ArgumentNullException">timerAction</exception> 
    /// <exception cref="System.ArgumentException">interval</exception> 
    public SingleThreadTimer(double interval, Action timerAction) 
    { 
     if (timerAction == null) 
      throw new ArgumentNullException("timerAction"); 

     if (interval <= 0) 
      throw new ArgumentException(string.Format("Invalid value '{0}' for parameter 'interval'.", interval), "interval"); 

     this.timerAction = timerAction; 

     this.timer = new Timer(interval) 
     { 
      AutoReset = false 
     }; 

     timer.Elapsed += timer_Elapsed; 
     timer.Start(); 
    } 

    public void Dispose() 
    { 
     if (timer != null) 
      timer.Dispose(); 
    } 

    private void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      timerAction(); 
     } 
     finally 
     { 
      // Enable timer again to continue elapsing event. 
      timer.Enabled = true; 
     } 
    } 
} 
関連する問題