2016-11-09 3 views
2

Во многих случаях мне нужно использовать эти функции в C#. Мои проекты должны быть .NET 4.0, а следующий код - результат, который я смог написать после чтения вопросов и ответов об этих функциях. Я использовал их некоторое время и не имел никаких проблем. Однако игра с потоками опасна, поэтому я сомневаюсь, что я делаю это неправильно или нет.Javascript SetTimeout, SetInterval и ClearInterval эквивалент в C#

Вопрос в том, являются ли эти функции безопасными в использовании; или есть лучший способ сделать это для .NET 4.0?

 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 нет таймеров, 'setTimeout' и' setInterval' являются методами DOM. – Teemu

+1

@Teemu - не слишком чрезмерно педантичный, вы знаете, что означал OP. –

+0

@ JᴀʏMᴇᴇ Комментарий не означал слишком-педантичный. Просто говоря, что таймеры не встроены в JavaScript. Это может быть полезно при попытке найти похожие функции с других языков. – Teemu

ответ

0

Единственный недостаток, который я мог бы найти до сих пор, заключается в том, что при выполнении действий приложение не может выйти. При завершении приложения эту функцию следует вызывать:

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); 
     } 
    } 
Смежные вопросы