2015-11-27 4 views
2

Я разрабатываю проект C# с использованием JINT (https://github.com/sebastienros/jint), и мне нужно создать таймер на моем JS, чтобы он мог выполнять функцию на моем javascript каждый раз, когда установлен таймер tim прошло. Как я могу это сделать? Я использовал функции setInterval или setTimeout, но кажется, что они не являются частью JINT, поскольку он основан на ECMASCRIPT, и эти функции не являются родными.Как создать таймер на JINT Javascript сторона

Может кто-нибудь сказать мне, как я могу это сделать ?.

Спасибо!

+0

Существует расширение годовых ckage, который утверждает, что предлагает именно это и многое другое: https://github.com/fredericaltorres/Jint.Ex – Hannobo

ответ

5

Ни setInterval, и setTimeout не поддерживаются Jint, потому что они являются частью API-интерфейса Window в браузерах. с Jint, а не с браузером, у нас есть доступ к CLR, и, честно говоря, он гораздо более универсален.

Первый шаг заключается в реализации нашего таймера в стороне CLR, Вот очень простой таймер оберткой для встроенного INT System.Threading.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(); 
    } 
} 
+0

Спасибо, Man!, Это сработало отлично! ... теперь я ищу что-то похожее на открытые и закрытые соединения tcp ... Ваш пример подсказывает мне тоже! – NicoRiff