using YLErp.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 风险计算运行基类 /// abstract class InnerRunnerBase { Task _task; CancellationTokenSource _cancelSource; /// /// 是否运行中 /// public bool IsRunning { get; private set; } /// /// 开始时间 /// public DateTime StartTime { get; private set; } /// /// 结束时间 /// public DateTime EndTime { get; private set; } /// /// 任务开始执行 /// protected Task InnerStartTask(Action action) { IsRunning = true; StartTime = DateTime.Now; _cancelSource = new CancellationTokenSource(); return _task = Task.Run(action); } /// /// 任务执行完成 /// protected void InnerCompleteTask() { lock (this) { IsRunning = false; EndTime = DateTime.Now; if (_cancelSource != null) { _cancelSource.Cancel(); _cancelSource.Dispose(); _cancelSource = null; } } } /// /// 任务取消执行 /// public void CancelTask(int taskWaitSeconds) { lock (this) { if (_cancelSource != null) { _cancelSource.Cancel(); _cancelSource.Dispose(); _cancelSource = null; } if (taskWaitSeconds > 0) { _task?.Wait(taskWaitSeconds); } IsRunning = false; EndTime = DateTime.Now; } } /// /// 使用当前时间和开始时间做比较判断是否超时 /// public bool IsTimeOut(int timeoutSeconds) { var nowTime = DateTime.Now; return StartTime < nowTime && StartTime.AddSeconds(timeoutSeconds) < nowTime; } /// /// 开始执行任务 /// public virtual void StartTask(InnerRunTaskData taskData) { } } class InnerRunTaskData { public bool IsReady { get; set; } public DateTime ValueDate { get; set; } public DateTime PreSettleDate { get; set; } public TradeDataSource TradeDataSource { get; set; } public TradeRiskCalcDataProvider DataProvider { get; set; } public IDataSource ManualRiskProvider { get; set; } public IDataSource ManualRiskProviderHedge { get; set; } } }