2016-11-09 11 views
2

In vielen Fällen muss ich diese Funktionen in C# verwenden. Meine Projekte müssen .NET 4.0 sein und folgender Code ist das Ergebnis, das ich nach dem Lesen von Fragen und Antworten zu diesen Funktionen schreiben konnte. Ich benutze sie seit einer Weile und hatte keine Probleme. Allerdings ist es gefährlich, mit Threads zu spielen, also habe ich Zweifel, ob ich es falsch mache oder nicht.Javascript SetTimeout, SetInterval und ClearInterval Entsprechung in C#

Meine Frage ist, sind diese Funktionen sicher zu bedienen; oder gibt es einen besseren Weg, es für .NET 4.0 zu tun?

 private static volatile List<System.Threading.Timer> _timers = new List<System.Threading.Timer>(); 
     private static object lockobj = new object(); 
     public static void SetTimeout(Action action, int delayInMilliseconds) 
     { 
      System.Threading.Timer timer = null; 
      var cb = new System.Threading.TimerCallback((state) => 
      { 
       lock (lockobj) 
        _timers.Remove(timer); 
       timer.Dispose(); 
       action(); 
      }); 
      lock (lockobj) 
       _timers.Add(timer = new System.Threading.Timer(cb, null, delayInMilliseconds, System.Threading.Timeout.Infinite)); 
     } 
     private static volatile Dictionary<Guid, System.Threading.Timer> _timers2 = new Dictionary<Guid, System.Threading.Timer>(); 
     private static object lockobj2 = new object(); 
     public static Guid SetInterval(Action action, int delayInMilliseconds) 
     { 
      System.Threading.Timer timer = null; 
      var cb = new System.Threading.TimerCallback((state) => action()); 
      lock (lockobj2) 
      { 
       Guid guid = Guid.NewGuid(); 
       _timers2.Add(guid, timer = new System.Threading.Timer(cb, null, delayInMilliseconds, delayInMilliseconds)); 
       return guid; 
      } 
     } 
     public static bool ClearInterval(Guid guid) 
     { 
      lock (lockobj2) 
      { 
       if (!_timers2.ContainsKey(guid)) 
        return false; 
       else 
       { 
        var t = _timers2[guid]; 
        _timers2.Remove(guid); 
        t.Dispose(); 
        return true; 
       } 
      } 
     } 
+0

JS hat keine Timer, 'setTimeout' und' setInterval' sind DOM-Methoden. – Teemu

+1

@Teemu - seien Sie nicht allzu pedantisch, Sie wissen, was das OP bedeutet. –

+0

@ JᴀʏMᴇᴇ Der Kommentar war nicht übermäßig pedantisch gemeint. Ich sage nur, dass Timer keine integrierten Funktionen in JavaScript sind. Das könnte nützlich sein, wenn Sie versuchen, ähnliche Funktionen aus anderen Sprachen zu finden. – Teemu

Antwort

0

Einziger Nachteil, den ich bisher finden konnte, ist, wenn es laufende Aktionen gibt, kann die Anwendung nicht beenden. Beim Beenden der Anwendung sollte diese Funktion aufgerufen werden:

public static void Free() 
    { 
     lock (lockobj) 
     { 
      foreach (var t in _timers) 
       t.Dispose(); 
      _timers.Clear(); 
     } 
     lock (lockobj2) 
     { 
      foreach (var key in _timers2.Keys.ToList()) 
       ClearInterval(key); 
     } 
    } 
Verwandte Themen