2016-08-31 9 views
-1

다음 코드를 사용하는 데 문제가 있습니다. SetTimer()을 호출하고 사용자가 interval에 도달하기 전에 사용자가 응답 할 것으로 예상하는 코드가 있습니다 ( 밀리 초). 호출 코드는 이러한 기능을 상속받습니다. 사용자가 응답하면 StopTimer()이 호출되고 정보는 StartTimer()이 호출되며 사용자는 interval 시간 내에 다시 응답해야합니다. 이는 사용자가 답장에 실패하거나 너무 오래 걸릴 때까지 계속됩니다 (interval 지나서).DispatcherTimer가 중지 된 후에도 계속 실행됩니다. C# UWP

문제는 타이머가 멈추지 않는다는 것입니다. 내가 멈춘 후에도 계속 반복됩니다. Tick 이벤트를 null (-= 방법으로)으로 설정하고 범위를 이탈했습니다. 심지어 새로운 저장소 인 새로운 DispatcherTimer (나는 이전의 것과 새로운 것을 각각 사용했다. 이전 Timer을 삭제할 수 없습니다.

내가 뭘 잘못하고 있니? 사전에

using Windows.UI.XAML; 

public DispatcherTimer GameTimer; 

internal void SetTimer(int interval) 
{ 
    GameTimer = new DispatcherTimer(); 
    GameTimer.Tick += TimerCallback; 
    GameTimer.Interval = new TimeSpan(0,0,0,0,interval); 
    GameTimer.Start(); 
} 

internal void StopTimer() 
{ 
    GameTimer.Stop(); 
    try 
    { 
     GameTimer.Tick -= TimerCallback; 
    } catch {} 
} 

private void TimerCallback(object sender, object e) 
{ 
    StopTimer(); 
    // Other code 
} 

감사합니다,

+3

'} catch {}'는 나쁜 습관입니다. 로그 또는 catch하지 않는 무슨 일이 일어나고 있는지. – ebyrob

+0

'System.Windows.Threading.DispatcherTimer'를 사용하여 해 보았습니까? 비슷한 코드를 실행 중이며 멈추는 데 문제가 없습니다. 나는'Windows.UI.XAML.DispatchTimer'을 시도 할 것이지만 윈도우 10의 개발 상자는 가지고 있지 않습니다. – ebyrob

+0

나는'System.Windows.Threading'을 사용하기 위해서'WindowsBase'를 참조로 설치해야한다고 믿습니다. UWP 앱이 가능하지 않다고 생각합니다. 아니면 적어도 어떻게 해야할지를 발견하지 못했습니다. 그래서. –

답변

-1

보낸 사람 개체를 사용하여 타이머를 중지 시도하지 실제 공공 타이머 객체 스틴

: 해결 방법으로

private void TimerCallback(object sender, object e) { 
    (sender as DispatcherTimer).Stop(); 
    // Other code 
} 
+0

제한 시간 내에 사용자가 응답 할 때 외부에서 타이머를 중지해야합니다. 따라서 외부 코드는 StopTimer()를 호출하여 작동하도록해야합니다. 이것은 그것을 고쳐주지 않았다. 하지만 도움을 주셔서 감사합니다. –

0

, 당신은 다음과 같이 할 수 있습니다.

// in your class 
private bool _allowExecution = false; 

당신이 시작할 때마다 그리고 시간이 _allowExecution = true;을 설정하고 타이머를 중지 할 때, 단순히 _allowExecution = false;

이 마지막 것은 실행하여 타이머에 단순히 부울 조건을 추가하는 것입니다 추가 : if (_allowExecute) //do your stuff here

0

을 새를 초기화하기 때문에 DispatcherTimer 매번 SetTimer(int interval)으로 전화하십시오. 새 인스턴스를 초기화하기 전에 이전 DispatcherTimer 인스턴스를 중지해야합니다.

internal void SetTimer(int interval) 
{ 
    StopTimer(); 
    GameTimer = new DispatcherTimer(); 
    GameTimer.Tick += TimerCallback; 
    GameTimer.Interval = new TimeSpan(0,0,0,0,interval); 
    GameTimer.Start(); 
} 

internal void StopTimer() 
{ 
    if(GameTimer != null) 
    { 
     GameTimer.Stop(); 
     GameTimer.Tick -= TimerCallback; 
     GameTimer = null; 
    } 
} 
+0

새로운 'DispatcherTimer'를 초기화하거나 클래스가 처음 설치 될 때 하나의 설정을 다시 사용하여 두 가지 방법을 시도했습니다. 문제가되지 않는 것 같습니다. 'GameTimer.Stop()'이 작동하지 않습니다. 이 코드를 정확하게 복사 했는데도 작동하지 않았습니다. –

+0

@JustinBurns 나는 GameTimer를 대중에게 알려주지 만, 어딘가에서 그것을 바꿀 수 있습니까? 새로운 빈 앱을 만들고 코드 스 니펫을 복사 할 수 있습니다. 제대로 작동하는 경우 돌아가서 프로젝트를 다시 확인해야 할 수도 있습니다. – tao

+0

두 버튼, 텍스트 상자 및 위의 타이머로 앱을 제안하고 만들었습니다. 각 버튼은 클릭 할 때 텍스트 상자에 이름을 표시하고 트리거되었을 때 타이머에 '시간'이 표시됩니다. 모든 것이 제대로 작동했습니다.이것은 프로그램의 나머지 부분에서 내 문제를 일으키는 것을 의미합니다. 적어도 타이머가 작동하는지, 제대로 사용하는지, 그리고 문제를 일으키는 앱의 나머지 부분에는 무언가가 있습니다. 도와 주셔서 감사합니다. –

관련 문제