2012-01-09 6 views
3

StopWatch를 만들려면 Timers.Timer를 만듭니다. 난 Perientular 시간 후 표시 시간 이벤트를 처리 Timer.Elapsed 사용할 수 있습니다. 타이머 간격을 1로 지정하고 true로 설정할 수 있습니다. 나는 또한 AutoReset을 true로 만든다. 그러나 문제는 당신에게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); 
    } 

감사 ... 이벤트는 발사됩니다 해우리 내가 성공을 얻을 모든 대안을 시도하지만 텍스트 상자마다 Second.I에 시간을 변경할 수 있습니다 만 once.How 텍스트 상자에 시간을 얻을 수있다 업데이트 : Visual Studio에서 새 웹 사이트를 만들어서 사용해보십시오.하지만 여전히 성공을 얻지는 못합니다. 문제가 있습니다. 지금 업데이트는 내가 줄 바꿈 점을 설정할 때입니다.

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

텍스트가 계속 변경되지만 TextBox에는 표시되지 않습니다. 희망을 이해할 수 있습니다.

+0

코드를 실행할 때 InvalidOperationException이 발생합니다. 그 이유는 StopWatchTimer_Tick 메서드가 다른 스레드의 컨트롤에 액세스하려고하기 때문입니다. 나머지 코드는 무엇입니까? – NotMe

+0

흥미롭게도, 컴파일하고 VS 외부에서 직접 실행하면 예상대로 작동합니다. 어떤 버전의 C#을 사용하고 있습니까? – NotMe

+0

@Chris Lively .NET Framework 4.0 – Hiren

답변

3

웹 페이지에서는 이렇게 할 수 없습니다.

페이지가 렌더링 될 때까지 서버가 완료되고 클라이언트 연결이 끊어졌습니다. 그것은 당신의 타이머에서 더 이상 업데이 트를 가지 않을거야.

숫자가 변하는 페이지 자체에 타이머가 있어야하는 경우 자바 스크립트를 통해이 작업을 수행해야합니다.

5

매개 변수를 설정하기 전에 Start()으로 전화하십시오. 이 시도 :

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

이 당신의 모든 속성을 설정 한 후 trueEnabled 속성을 설정합니다. 당신이 알고 있다면, 또한 확실

하지합니다 (Start() 메서드를 호출하면 Enabled = true을 설정하는 것과 같습니다)하지만 Timer.Interval 속성은 밀리 초 단위입니다. 따라서 밀리 초마다 Timer.Elapsed 이벤트가 발생합니다. 그냥 FYI.

+0

답변 해 주셔서 감사합니다. 시작하기 전에 속성을 설정해야합니다. 그래도 그래도 텍스트 상자에 이벤트가 발생하지 않는 것보다 가치가 있습니다. – Hiren

+0

간격을 1000으로 설정하십시오. 타이머를 어떻게 알 수 있습니까? . 이탈 이벤트는 한 번만 발사됩니까 ?? –

+0

사실 나는 거기에 브레이크 포인트를 설정했습니다 .1000으로 설정하면 심지어 한번은 – Hiren

1

또한 텍스트 상자의 내용은 콜백 컨텍스트가 아닌 UI 스레드에 의해서만 변경되어야한다는 점을 고려해야합니다. 콜백에 예외가 있습니까? Dispatcher를 사용하여 타이머 스레드 대신 기본 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 응용 프로그램이 아닌 웹 응용 프로그램을 사용하고 있습니다. – Hiren

관련 문제