2016-08-31 2 views
-1

Ich habe Probleme mit dem folgenden Code. Ich habe einen Code, der SetTimer() aufruft und erwartet, dass der Benutzer antwortet, bevor interval erreicht wird (in Millisekunden). Der aufrufende Code erbt diese Funktionen. Wenn der Benutzer antwortet, wird StopTimer() aufgerufen, Info wird angezeigt, StartTimer() wird aufgerufen, und der Benutzer wird voraussichtlich erneut innerhalb der interval Zeitperiode antworten. Dies geht so lange, bis der Benutzer eine Antwort verfehlt oder zu lange dauert (geht über die interval hinaus).DispatcherTimer hält weiter an, nachdem ich es gestoppt habe. C# UWP

Das Problem ist, dass die Timer nicht aufhören. Sie wiederholen sich auch, nachdem ich sie gestoppt habe, setzen ihr Tick Ereignis auf null (durch die Methode -=) und beließen ihren Bereich. Ich bekomme sogar neuen Speicher mit einem neuen DispatcherTimer (ich habe dies sowohl mit dem alten als auch mit einem neuen gemacht). Ich kann nicht die alte Timer weggehen.

Was mache ich falsch?

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 
} 

Vielen Dank im Voraus,

-Justin

+3

'} fangen {}' ist nur schlechte Übung. Protokollieren oder nicht fangen, um sicher zu sein, was los ist. – ebyrob

+0

Haben Sie versucht, 'System.Windows.Threading.DispatcherTimer' zu verwenden. Ich führe einen ähnlichen Code aus und habe keine Probleme damit aufzuhören. Ich würde 'Windows.UI.XAML.DispatchTimer' versuchen, aber kein Windows 10 Dev-Feld haben. – ebyrob

+0

Ich glaube, um 'System.Windows.Threading' verwenden zu können, muss ich' WindowsBase' als Referenz installiert haben, was meiner Meinung nach für eine UWP-App nicht möglich ist, oder zumindest habe ich nicht herausgefunden, wie es geht damit. –

Antwort

-1

Versuchen Sie, den Timer zu stoppen, indem Sie das Senderobjekt verwenden, nicht das tatsächliche öffentlichen Timer-Objekt:

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

Ich muss auch den Timer von außen stoppen - wenn der Benutzer innerhalb der Frist antwortet. Also außerhalb Code muss StopTimer() aufrufen und es funktioniert. Das hat es nicht behoben. Aber danke für die Hilfe. –

0

Als Abhilfe können Sie könnte etwas tun wie:

// in your class 
private bool _allowExecution = false; 
Dann

, wenn Sie die Startzeit eingestellt _allowExecution = true; und wenn Sie den Timer zu stoppen, fügen Sie einfach _allowExecution = false;

Das letzte, was eine einfach boolean Zustand auf dem Timer hinzuzufügen sein wird ausgeführt: if (_allowExecute) //do your stuff here

0

Da Sie einen neuen initialisieren DispatcherTimer Everytime Anruf SetTimer(int interval). Sie müssen die alte DispatcherTimer Instanz stoppen, bevor Sie eine neue initialisieren.

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

Ich habe es in beide Richtungen versucht, einen neuen "DispatcherTimer" initialisiert oder ein Setup wiederverwendet, wenn die Klasse zum ersten Mal eingerichtet wird. Es scheint nicht wichtig zu sein: 'GameTimer.Stop()' funktioniert nicht. Ich habe diesen Code genau kopiert und es hat auch nicht funktioniert. –

+0

@JustinBurns Ich merke, dass Sie GameTimer veröffentlichen, ändert es irgendwo? Sie können eine neue leere App erstellen und das Code-Snippet einfach kopieren. Wenn es funktioniert, müssen Sie möglicherweise zurückgehen und Ihr Projekt überprüfen. – tao

+0

Ich habe getan, wie Sie vorgeschlagen haben und eine App mit zwei Tasten, einem Textfeld und dem oben genannten Timer erstellt. Jede Taste zeigte ihren Namen in der Textbox an, wenn sie angeklickt wurde und der Timer zeigte "Zeit" an, als er ausgelöst wurde. Alles hat so funktioniert wie es soll.Dies bedeutet, dass etwas in der Masse des Rests des Programms mein Problem verursacht. Zumindest weiß ich, dass der Timer funktionieren sollte, ich benutze ihn richtig und es gibt etwas in der Masse des Rests der App, das das Problem verursacht. Danke für die Hilfe. –

Verwandte Themen