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;
}
}
}
JS没有定时器,setTimeout和setInterval是DOM方法。 – Teemu
@泰姆 - 不要过于迂腐,你知道OP的含义。 –
@JᴀʏMᴇᴇ评论并不意味着过于迂腐。只是说,定时器不是JavaScript中的内置功能。这可能是有用的,当试图找到其他语言的类似功能。 – Teemu