public IRuntimeManager GetRuntime() { IRuntimeManager manager; if (_availableRuntimes.TryTake(out manager)) return manager; int runtimeMaxCount = _settings.RuntimeMaxCount; if (RuntimeCurrentCount < runtimeMaxCount) { lock (_addLock) { if (RuntimeCurrentCount < runtimeMaxCount) { var runtime = new RuntimeManager(_settings); RuntimeCurrentCount++; return runtime; } } } return _availableRuntimes.Take(); }
/// <summary> /// Dipor do objeto /// </summary> public void Dispose() { //TimedOuts.ForEach(t=> t.Dispose()); _engine.Interrupt(); _manager.Cleanup(); _manager.Dispose(); _manager = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.WaitForFullGCComplete(60000); GC.Collect(); }
/// <summary> /// configura o Helper para posterior execuçao /// </summary> /// <param name="diretorioJavascripts">Diretório onde estão os arquivos em js</param> /// <param name="setTimeout">Habilitar a função global setTimeout</param> /// <param name="setInterval">Habilitar a função global setInterval</param> private void Carregar(string diretorioJavascripts, bool setTimeout, bool setInterval) { TimedOuts = new List<IDisposable>(); _diretorioExecucao = diretorioJavascripts; _timeoutTestes = int.MaxValue; ExecutouTestesAteFinal = false; SetTimeOutLigado = setTimeout; //O manager vai compilar e cachear as bibliotecas _manager = new RuntimeManager(new ManualManagerSettings() { MaxExecutableBytes = (1000000000 * 2), RuntimeMaxCount = int.MaxValue}); _engine = _manager.GetEngine(); //RequireManager.ClearPackages(); //garantir uma execução limpa #region Ler arquivos Js _cacheCodigos = new Dictionary<string, string>(); foreach (var enumerateFile in Directory.EnumerateFiles(diretorioJavascripts, "*.js")) { _cacheCodigos.Add(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile)); //_manager.Compile(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile), true, int.MaxValue); } #endregion #region Configura a Engine com o JavascriptHelper e Console, Settimeout e etc FalhasDosTestes = new List<string>(); _timers = new Dictionary<int, bool>(); _engine.AddHostObject("javascriptHelper", this); _engine.Execute(@"'use strict'; function console() { if (!(this instanceof console)) { return new Console(); } } console.prototype.log = function(args, args1, args2) { javascriptHelper.Escrever(args, args1, args2); };"); _engine.Execute("var console = new console();"); _engine.Execute("var GLOBAL = this;"); _engine.Execute(@"var stFunctionsCallBack = new Array();"); if (setTimeout) { _engine.Execute(@"var setTimeout = function (funcToCall, millis) { var textoId = javascriptHelper.CurrentThreadId; var idlocal = javascriptHelper.SetTimeout(millis); stFunctionsCallBack.push(funcToCall); return idlocal; };"); _engine.Execute(@"var clearTimeout = function(id) { javascriptHelper.ClearTimeout(id);};"); } if (setInterval) { _engine.Execute(@"var setInterval = function (funcToCall, millis) { var idlocal = javascriptHelper.SetTimeout(millis); var funcaoTimeout = function() { funcToCall(); setTimeout(funcToCall, millis); }; stFunctionsCallBack.push(funcaoTimeout); return idlocal; };"); _engine.Execute(@"var clearInterval = function(id) { javascriptHelper.ClearTimeout(id);};"); } #endregion }