public void Start(Component.SLComponent root, params Type[] templates) { if (!_state.Is(EState.Closed)) { throw new InvalidOperationException($"wrong state: {_state.ToString()}"); } Task.Factory.StartNew(() => { var fq = _state.Frequency; var dispatcher = new Execution.Terminal.RawDispatcher(_state.EndPoint); var executorList = new List <Execution.ISLExecutor>(templates.Length); for (int i = 0; i != templates.Length; i++) { var exe = (Execution.ISLExecutor)Activator.CreateInstance(templates[i]); executorList.Add(exe); } _state.Set(EState.Running); while (_state.Is(EState.Running)) { var begin = Library.Ticker.MS; try { for (int i = 0; i != executorList.Count; i++) { try { executorList[i].ExecuteFrame(ref dispatcher, root); } catch (ArgumentException e) { Library.Logger.Error($"{_state.ToString()}\n[Engine::{executorList[i].GetType().Name}]\n{e.Message}\n{e.StackTrace}"); } catch (KeyNotFoundException e) { Library.Logger.Error($"{_state.ToString()}\n[Engine::{executorList[i].GetType().Name}]\n{e.Message}\n{e.StackTrace}"); } catch (Exception) { Library.Logger.Error($"{_state.ToString()}\n[Engine::{executorList[i].GetType().Name}]\n"); throw; } } } catch (Exception e) { Library.Logger.Exception(typeof(Engine), e); } finally { var end = Library.Ticker.MS; int leg = (int)(end - begin) - fq; if (leg < 0) { Thread.Sleep(-leg); } } } _state.Set(EState.Closed); }); }
public static Component.SLComponent _defaultConstructForTest(Component.SLComponent root) { var com = Component.SLComponent.Factory.Create(root, Component.ComponentType.Service); unsafe { var serviceProp = com.Get <Component.Property.Service>(); serviceProp->maxDestroyCount = 9999; serviceProp->destroyCount = 0; } var pkCom1 = Component.SLComponent.Factory.Create(com, Component.ComponentType.Package, Component.PackageKey.Observer); var pkCom2 = Component.SLComponent.Factory.Create(com, Component.ComponentType.Package, Component.PackageKey.Cell); return(com); }
public static Engine RunNewService <TService>(this WebSocketServer wssv, Component.SLComponent root, string path, params Type[] templates) where TService : WebSocketBehavior, new() { wssv.AddWebSocketService <TService>(path); var awaiter = Component.SLComponent.Factory.LoadAsync(root, path).GetAwaiter(); var serviceCom = awaiter.GetResult(); if (serviceCom == null) { serviceCom = Function._defaultConstructForTest(root); } var ep = Function.ParseEndPoint(path); root.LinkTo(ep, serviceCom); var engine = new Engine(ep, 60); engine.Start(serviceCom, templates); return(engine); }