2016-11-23 1 views
0

Die Window wird automatisch nach 5 Sekunden ausgeblendet, nachdem sie angezeigt wird (ShowWindow Methode). Es kann auch manuell versteckt werden (HideWindow Methode). Hier ist meine aktuelle Implementierung.CancellationTokenSource korrekt durch neue ersetzen

Das Problem: Wenn ich öffne und schließe dann das Fenster manuell einige Male hintereinander, verbirgt es sich dann sofort zu 1 Sekunde nach dem Öffnen. Es sollte nicht von Entwurf sein. Der Grund ist, dass ich CTS durch ein neues ersetze, und eine Löschung wird nie angefordert. Ich habe schlechte Fähigkeiten mit CTS und kann nicht daran denken, wie man das richtig umsetzt.

public class Window 
    { 
     public bool Visible { get; set; } 
     public CancellationTokenSource HideErrorWindowCTS { get; set; } 

     public async void ShowWindow() 
     { 
      Visible = true; 
      await Task.Delay(TimeSpan.FromSeconds(5)); 
      if (!HideErrorWindowCTS.IsCancellationRequested) 
      { 
       Visible = false; 
      } 
     } 

     public void HideWindow() 
     { 
      HideErrorWindowCTS.Cancel(); 
      HideErrorWindowCTS = new CancellationTokenSource(); 
      Visible = false; 
     } 
    } 
+1

Vielleicht sollten Sie das _token_ an die Methode und nicht die Token-Quelle übergeben - dann können Sie ['CancellationToken.None'] (https://msdn.microsoft.com/en-us/library/system.threading verwenden. cancellingtoken.none (v = vs.110) .aspx), wenn Sie nicht möchten, dass es abbricht. – stuartd

Antwort

2

Da ShowWindow bei HideErrorWindowCTS schaut, sieht es an der neu aktualisierten Stornierung Token Quelle, nicht das Token zu dem Zeitpunkt zu dem CTS entsprechenden zeigen Sie das Fenster. Greifen Sie einfach dieses Token und speichern Sie es in einer lokalen Variablen vor Sie warten, so dass auch wenn HideErrorWindowCTS ändert, haben Sie immer noch das gleiche Token zu überprüfen, nachdem die Verzögerung beendet ist.

+0

Das habe ich gebraucht, danke! – AsValeO

Verwandte Themen