internal override WorkItem GetNext() { CallQueued.WaitOne(); lock (m_HighPriorityItemQueue) { if (m_HighPriorityItemQueue.Count >= 1) { return(m_HighPriorityItemQueue.Dequeue()); } } lock (m_NormalPriorityItemQueue) { if (m_NormalPriorityItemQueue.Count >= 1) { return(m_NormalPriorityItemQueue.Dequeue()); } } lock (m_LowPriorityItemQueue) { if (m_LowPriorityItemQueue.Count >= 1) { return(m_LowPriorityItemQueue.Dequeue()); } } return(null); }
private void PbxProvider_NewCall(object sender, NewCallEventArgs args) { _queueOfCalls.Enqueue(args.NewCall); CallQueued?.Invoke(this, new CallQueuedEventArgs { QueuedCall = args.NewCall, CurrentQueuedCallCount = _queueOfCalls.Count }); }
internal virtual void QueueWorkItem(WorkItem workItem) { lock(m_WorkItemQueue) { m_WorkItemQueue.Enqueue(workItem); CallQueued.Release(); } }
public void Abort() { CallQueued.Release(Int32.MaxValue); foreach (WorkerThread thread in m_WorkerThreads) { thread.m_ThreadObj.Abort(); } CallQueued.Close(); }
internal virtual WorkItem GetNext() { CallQueued.WaitOne(); lock (m_WorkItemQueue) { if (m_WorkItemQueue.Count == 0) { return(null); } return(m_WorkItemQueue.Dequeue()); } }
internal override void QueueWorkItem(WorkItem workItem) { CallPriority priority; GenericContext <CallPriority> context = GenericContext <CallPriority> .Current; if (context == null) { priority = Priority;//Read from TLS } else { priority = context.Value; } switch (priority) { case CallPriority.Low: { lock (m_LowPriorityItemQueue) { m_LowPriorityItemQueue.Enqueue(workItem); CallQueued.Release(); return; } } case CallPriority.Normal: { lock (m_NormalPriorityItemQueue) { m_NormalPriorityItemQueue.Enqueue(workItem); CallQueued.Release(); return; } } case CallPriority.High: { lock (m_HighPriorityItemQueue) { m_HighPriorityItemQueue.Enqueue(workItem); CallQueued.Release(); return; } } default: { throw new InvalidOperationException("Unknown priority value: " + priority); } } }
public void Close() { if (CallQueued.SafeWaitHandle.IsClosed) { return; } CallQueued.Release(Int32.MaxValue); foreach (WorkerThread thread in m_WorkerThreads) { thread.Kill(); } CallQueued.Close(); }