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); }