2016-11-09 120 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

@泰姆 - 不要过于迂腐,你知道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); 
     } 
    } 
相关问题