2012-01-09 9 views
3

StopWatchを作成するためにTimers.Timer。私はTimer.Elapsedを使用して、perticular時間後の表示時間を処理します。私は1のタイマー間隔を与え、真に有効にします。私はまた、AutoResetをtrueにします。しかし、問題は、イベントが、私が唯一once.How私はTimer.Elapsed火事イベントは一度だけ、私は毎秒それを欲しい

System.Timers.Timer StopWatchTimer = new System.Timers.Timer(); 
    Stopwatch sw = new Stopwatch(); 
    public void StopwatchStartBtn_Click(object sender, ImageClickEventArgs e) 
    { 

     StopWatchTimer.Start(); 
     StopWatchTimer.Interval = 1; 
     StopWatchTimer.Enabled = true; 
     StopWatchTimer.AutoReset =true; 
     sw.Start(); 
     StopWatchTimer.Elapsed += new System.Timers.ElapsedEventHandler(StopWatchTimer_Tick); 
    } 

    protected void StopWatchStopBtn_Click(object sender, ImageClickEventArgs e) 
    { 

     TextBoxStopWatch.Text = "00:00:000"; 
     StopWatchTimer.Stop(); 
     sw.Reset(); 
     sw.Stop(); 

    } 

    public void StopWatchTimer_Tick(object sender,EventArgs e) 
    {   
    TextBoxStopWatch.Text= Convert.ToString(sw.Elapsed); 
    } 

ありがとう... TextBoxのすべてのSecond.Iでの時間は成功を得るすべての代替案を試してみなく変更することができますテキストボックスに時刻を取得するだけonce.and発射されています更新: 私はVisual Studio.Butで新しいウェブサイトを作成することによってそれを試しても、まだ成功していません。同じ問題。今、更新は、私はラインにブレークポイントを設定するとき

 TextBoxStopWatch.Text= Convert.ToString(sw.Elapsed); 

テキストが連続して存在し変更が、テキストボックスに表示されていないです。あなたはこれを理解することを願っています。

+0

コードを実行すると、InvalidOperationExceptionが発生します。理由は、StopWatchTimer_Tickメソッドが別のスレッドのコントロールにアクセスしようとしているためです。残りのコードは何ですか? – NotMe

+0

興味深いことに、私がコンパイルして(VSの外で)直接実行すると、期待どおりに動作します。どのバージョンのC#を使用していますか? – NotMe

+0

@Chris Lively .NET Framework 4.0 – Hiren

答えて

3

ウェブページでこのようにすることはできません。

ページがレンダリングされるまでに、サーバーは完了し、クライアントは切断されました。それはあなたのタイマーからそれ以上のアップデートを得るつもりはありません。

あなたは、ページ自体にいくつかの変化する数字を示すタイマーを持っている必要がある場合は、javascriptでこれを行う必要があります。

5

パラメータを設定する前にStart()に電話しています。あなたの特性のすべてが設定された後trueEnabledプロパティを設定し

StopWatchTimer.Interval = 1000; 
StopWatchTimer.AutoReset = true; 
StopWatchTimer.Elapsed += new System.Timers.ElapsedEventHandler(StopWatchTimer_Tick); 
StopWatchTimer.Enabled = true; 

:これを試してみてください。あなたはこのことを認識している場合、また必ず

ない(Start()メソッドを呼び出すとEnabled = trueを設定することと同じです)が、Timer.Intervalプロパティはミリ秒単位です。したがって、ミリ秒ごとにTimer.Elapsedイベントが発生しています。ちょうどFYI。

+0

あなたの答えをありがとう。私はそれを開始する前にプロパティをssetする必要があります。私はそれを行うが、まだテキストボックスで値を1回だけイベントを発生させないよりも得る – Hiren

+0

あなたの間隔を1000に設定してみてください。 .Elapsedイベントは一度だけ発砲していますか? –

+0

実際に私はBreakPointをそこに設定しました.Afterを1000に設定すると、一度それを取得しなくても、 – Hiren

1

また、テキストボックスの内容はコールバックコンテキストではなくUIスレッドによってのみ変更する必要があることも考慮する必要があります。あなたはコールバックの例外を取っていますか? ディスパッチャを使用して、タイマースレッドではなくメインのUIスレッドでUI更新プログラムを呼び出します。

0

以下は私のために働く。私は、タイマー/ストップウォッチの設定は、混乱を避けるために一度だけ設定され、UIスレッドの呼び出しにも対処するように、事柄を並べ替えました。

System.Timers.Timer timer; 
    Stopwatch stopwatch; 

    public Form1() 
    { 
     InitializeComponent(); 

     timer = new System.Timers.Timer(); 
     timer.Interval = 1000; 
     timer.AutoReset = true; 
     timer.Elapsed += new ElapsedEventHandler(TimerElapsed); 

     stopwatch = new Stopwatch(); 
    } 

    public void TimerElapsed(object sender, EventArgs e) 
    { 
     TextBoxStopWatch.Text = Convert.ToString(stopwatch.Elapsed); 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer.Start(); 
     stopwatch.Start(); 
    } 

    private void btnStop_Click(object sender, EventArgs e) 
    { 
     TextBoxStopWatch.Text = "00:00:000"; 
     timer.Stop(); 
     stopwatch.Reset(); 
     stopwatch.Stop(); 
    } 
+0

こんにちはお返事ありがとうございます。私はInvokeまたはInvokeRequiredを持っていないので、私はWindowsアプリケーションではないWebアプリケーションで作業しています。 – Hiren

関連する問題