private void ExecScript(object state) { if (!(state is IScriptRootData data)) { return; } try { if (data.E.EntityType == EntityType.Proxy) { WaitForExec.TryRemove(data.ScriptId, out _); return; } if (!ScriptRunInfo.TryGetValue(data.ScriptId, out var info)) { info = new ScriptInfo(); } info.LastStart = DateTime.Now; info.Count++; Interlocked.Increment(ref info.RunningInstances); processScript(data); Interlocked.Decrement(ref info.RunningInstances); lock (ExecQueue) WaitForExec.TryRemove(data.ScriptId, out _); info.ExecTime += DateTime.Now - info.LastStart; ScriptRunInfo.AddOrUpdate(data.ScriptId, info, (id, i) => info); Interlocked.Increment(ref _MainCount); if (MainCount > ScriptsCount) { if (Interlocked.Exchange(ref _MainCount, 0) > 0 && (DateTime.Now - LastIterationUpdate).TotalSeconds >= 1) { LastIterationUpdate = DateTime.Now; Interlocked.Increment(ref _Iteration); } } } catch (Exception error) { Log($"EmpyrionScripting Mod: ExecNext {data.ScriptId} => {error}", LogLevel.Debug); } }
public void Clear() { try { ScriptRunInfo = new ConcurrentDictionary <string, ScriptInfo>(ScriptRunInfo.Where(S => S.Value.RunningInstances > 0).ToArray()); } catch (Exception error) { ScriptRunInfo.Clear(); Log($"EmpyrionScripting Mod: Clear => {error}", LogLevel.Error); } WaitForExec.Clear(); ExecQueue = new ConcurrentQueue <IScriptRootData>(); }