Ejemplo n.º 1
0
        public void Exit(string bookmark, string queueName)
        {
            CriticalSectionResumptionInfo nextInQueue = null;

            lock (LockObject)
            {
                CriticaSectionQueue requestQueue = GetRequestQueue(queueName);

                CriticalSectionResumptionInfo exiting = requestQueue.ResumptionQueue.Find(
                    resumptionInfo => resumptionInfo.ResumptionBookmark == bookmark);
                requestQueue.ResumptionQueue.Remove(exiting);


                if (exiting == requestQueue.ExecutingCriticalSection)
                {
                    if (requestQueue.ResumptionQueue.Count > 0)
                    {
                        nextInQueue = requestQueue.ResumptionQueue[0];
                        requestQueue.ExecutingCriticalSection = nextInQueue;
                    }
                    else
                    {
                        requestQueue.ExecutingCriticalSection = null;
                    }
                }
            }
            if (nextInQueue != null)
            {
                nextInQueue.WorkflowInstanceExtension._workflowInstance.BeginResumeBookmark(
                    new Bookmark(nextInQueue.ResumptionBookmark), null, null, null);
            }
        }
Ejemplo n.º 2
0
            public CriticalSectionResumptionInfo Add(CriticalSectionQueueExtension workflowInstaceExtension,
                                                     string bookmark, long priorityTicket)
            {
                if (priorityTicket == long.MinValue)
                {
                    priorityTicket = GetPriorityTicket();
                }

                int positionInTheQueue = ResumptionQueue.TakeWhile(
                    resumptionItem => resumptionItem.PriorityTicket <= priorityTicket).Count();

                CriticalSectionResumptionInfo criticalSectionResumptionInfo =
                    new CriticalSectionResumptionInfo(workflowInstaceExtension, bookmark, priorityTicket);

                ResumptionQueue.Insert(positionInTheQueue, criticalSectionResumptionInfo);
                return(criticalSectionResumptionInfo);
            }
Ejemplo n.º 3
0
        public bool Enter(string bookmark, string queueName, long priorityTicket)
        {
            int requestQueueCount;

            lock (LockObject)
            {
                CriticaSectionQueue requestQueue = GetRequestQueue(queueName);

                CriticalSectionResumptionInfo criticalSectionResumptionInfo =
                    requestQueue.Add(this, bookmark, priorityTicket);
                requestQueueCount = requestQueue.ResumptionQueue.Count;
                if (requestQueueCount == 1)
                {
                    requestQueue.ExecutingCriticalSection = criticalSectionResumptionInfo;
                }
            }

            if (requestQueueCount == 1)
            {
                _workflowInstance.BeginResumeBookmark(new Bookmark(bookmark), null, null, null);
                return(true);
            }
            return(false);
        }