我正在使用JINT(https://github.com/sebastienros/jint)开发一个C#项目,我需要在我的JS上创建一个计时器,以便每次经过计时器tim设置时它都可以在我的JavaScript上执行一个功能。我该怎么做?我使用过setInterval或setTimeout函数,但由于它们基于ECMASCRIPT,因此它们似乎不是JINT的一部分,并且此函数不是本机的。
有人可以告诉我我该怎么做吗?
谢谢!!
无论是setInterval
和setTimeout
被Jint,因为他们是在浏览器窗口API的一部分支持。使用Jint,而不是浏览器,我们可以访问CLR,并且说老实话,它的用途更加广泛。
第一步是在CLR端实现我们的Timer,这是内置intSystem.Threading.Timer
类的一个非常简单的Timer包装器:
namespace JsTools
{
public class JsTimer
{
private Timer _timer;
private Action _actions;
public void OnTick(Delegate d)
{
_actions += () => d.DynamicInvoke(JsValue.Undefined, new[] { JsValue.Undefined });
}
public void Start(int delay, int period)
{
if (_timer != null)
return;
_timer = new Timer(s => _actions());
_timer.Change(delay, period);
}
public void Stop()
{
_timer.Dispose();
_timer = null;
}
}
}
下一步是绑定JsTimer
到Jint引擎:
var engine = new Engine(c => c.AllowClr(typeof (JsTimer).Assembly))
这是一个用法示例:
internal class Program
{
private static void Main(string[] args)
{
var engine = new Engine(c => c.AllowClr(typeof (JsTimer).Assembly))
.SetValue("log", new Action<object>(Console.WriteLine))
.Execute(
@"
var callback=function(){
log('js');
}
var Tools=importNamespace('JsTools');
var t=new Tools.JsTimer();
t.OnTick(callback);
t.Start(0,1000);
");
Console.ReadKey();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句