using System; using sharp.trading; using System.IO; using System.Timers; using System.Threading; using System.Collections.Generic; namespace sharp.tradebot { public delegate void PeriodicWorker(); public class TradingBotEnvironment : MarshalByRefObject { public string BaseDataDirectory { get; private set; } public TradingConnection TradingConnection { get; private set; } Thread periodicsThread; bool contPeriodics = true; List periodicTasks = new List(); public TradingBotEnvironment(TradingConnection connection,string baseDataDirectory){ BaseDataDirectory = baseDataDirectory; TradingConnection = connection; periodicsThread = new Thread(periodics); periodicsThread.Start(); } public void RegisterPeriodic(PeriodicWorker worker,int timeout){ lock (periodicTasks){ periodicTasks.Add(new PeriodicTask(timeout,worker)); } } public void UnregisterPeriodic(PeriodicWorker worker) { lock (periodicTasks) { foreach (PeriodicTask ptask in periodicTasks.ToArray()){ if (ptask.worker == worker){ periodicTasks.Remove(ptask); } } } } public void Stop(){ lock (this){ this.contPeriodics = false; } this.periodicsThread.Join(); } private void periodics(){ Thread.Sleep(1000); while (true){ lock (this){ if (!contPeriodics) { break; } } lock (periodicTasks){ foreach (PeriodicTask ptask in periodicTasks){ ptask.Check(); } } Thread.Sleep(250); } } class PeriodicTask { public DateTime lastRun; public Int64 interval; public PeriodicWorker worker; public PeriodicTask(Int64 interval,PeriodicWorker worker){ this.worker = worker; this.interval = interval; this.lastRun = DateTime.Now; } public void Check() { if ((this.lastRun == null) || ((DateTime.Now - this.lastRun).TotalSeconds >= this.interval)) { this.lastRun = DateTime.Now; try { lock (this.worker.Target){ if (!typeof(TradingBot).IsInstanceOfType(this.worker.Target) || ((TradingBot)this.worker.Target).IsPrepared){ try { this.worker(); } catch (Exception e){ Console.WriteLine("Exception: {0}",e); } } } } catch (Exception e){ Console.WriteLine("Exception: {0}",e.ToString()); } } } } } }