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);
            }
        }
 public long GetPriorityTicket(string queueName)
 {
     lock (LockObject)
     {
         CriticaSectionQueue requestQueue = GetRequestQueue(queueName);
         return(requestQueue.GetPriorityTicket());
     }
 }
        private static CriticaSectionQueue GetRequestQueue(string queueName)
        {
            CriticaSectionQueue requestQueue;

            if (!RequestQueues.TryGetValue(queueName, out requestQueue))
            {
                requestQueue = new CriticaSectionQueue(queueName);
                RequestQueues.Add(queueName, requestQueue);
            }
            return(requestQueue);
        }
        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);
        }