sharp-tradebot/TradingBotEnvironment.cs

116 lines
2.4 KiB
C#

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<PeriodicTask> periodicTasks = new List<PeriodicTask>();
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());
}
}
}
}
}
}