вторник, 27 августа 2019 г.

Process in TradeTerminals on the ProcessTask

ProcessTask:
public sealed partial class QuikTradeTerminal
    {
        public bool IsProcessTaskInUse { get; set; }
        [XmlIgnore]
        public ProcessTask<IEventArgs1> ProcessTask { get; private set; }
        private void SetupProcessTask()
        {
            if (!IsProcessTaskInUse)
            {
                Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, ParentName, Name,
                MethodBase.GetCurrentMethod().Name, "ProcessTask Will NOT BE USED",
                ToString());
                return;
            }
            ProcessTask = new ProcessTask<IEventArgs1>
            {
                Parent = this,
                TimeInterval = 1000,
                IsEveryItemPushProcessing = true,
                ItemProcessingAction = ItemProcessingAction,
                IdlingCycleAction = ProcessTaskIdleAction
            };
            ProcessTask.Init();

            Evlm2(EvlResult.SUCCESS, EvlSubject.TECHNOLOGY, ParentName, Name,

                 MethodBase.GetCurrentMethod().Name, "ProcessTask IS USED NOW",
                 ProcessTask?.ToString());
        }
        public void Start()
        {
            SetupProcessTask();

            if(IsProcessTaskInUse)

                ProcessTask?.Start();
        }
        public void Stop()
        {
            if (IsProcessTaskInUse)
                ProcessTask?.Stop();
        }
        // ************************************************
        // ProcessTask Actions
        private void ItemProcessingAction(IEventArgs1 args)
        {
            try
            {
                args.ProcessingAction(args);
            }
            catch (Exception e)
            {
                SendException(e);
            }
        }
        // AdditionalWorks in IdlingCycleAction
        private void ProcessTaskIdleAction()
        {
            TradeResolveProcess2();
            OrderResolveProcess();
        }
    }

Process in TradeTerminal to linear Execution:
1. SendTransaction From Queue:

        public void SendTransaction(IQuikTransaction t)

        {
            if (t == null)
                return;

            if (IsProcessTaskInUse)

            {
                var eargs = new EventArgs1
                {
                    Process = "QuikTransactionsProcess",
                    Category = "QuikTransactions",
                    Entity = "TransactionSend",
                    Operation = "AddOrUpdate",
                    Object = t,
                    ProcessingAction = SendTransactionFromQueue
                };
                ProcessTask?.EnQueue(eargs);
            }
            else
                TransactionQueue.Push(t);
        }
2. Clear Transactions From Queue when Terminal is NOT_CONNECTED

public void ClearTransactionFromQueue()

        {
            if (IsProcessTaskInUse)
            {
                var eargs = new EventArgs1
                {
                    Process = "QuikTransactionsProcess",
                    Category = "QuikTransactions",
                    Entity = "TransactionClear",
                    Operation = "AddOrUpdate",
                    ProcessingAction = ClearOrderTransactionQueue3
                };
                ProcessTask?.EnQueue(eargs);
            }
            else
                ClearOrderTransactionQueue3(null);
        }