【发布时间】:2016-11-09 08:26:26
【问题描述】:
在很多情况下,我需要在 C# 中使用这些函数。我的项目必须是 .NET 4.0,以下代码是我在阅读有关这些功能的问题和答案后能够编写的结果。我已经使用它们一段时间了,没有任何问题。但是,玩线程是很危险的,所以我怀疑我是否做错了。
我的问题是,这些功能可以安全使用吗?或者对于 .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 的内置功能。在尝试从其他语言中查找类似功能时,这可能很有用。
标签: javascript c#