private void ProcessTask(ISynchronizedOperation taskProcessor)
        {
            bool tryExecuteTask(Task task)
            {
                s_currentlyExecutingTask = true;
                bool result = TryExecuteTask(task);

                s_currentlyExecutingTask = false;

                return(result);
            }

            // This loop ensures that we execute exactly
            // one task unless there are no tasks to execute
            while (true)
            {
                if (!Queue.TryDequeue(out Task task))
                {
                    break;
                }

                if (tryExecuteTask(task))
                {
                    break;
                }
            }

            if (TryDeactivate(taskProcessor))
            {
                return;
            }

            taskProcessor.RunAsync();
        }
Beispiel #2
0
        /// <summary>
        /// Creates a new <see cref="AsyncQueue{T}"/>.
        /// </summary>
        /// <param name="synchronizedOperationType">The type of synchronized operation to use to process items in the queue.</param>
        public AsyncQueue(SynchronizedOperationType synchronizedOperationType)
        {
            m_asyncQueue = new ConcurrentQueue <T>();
            m_enabled    = 1;

            switch (synchronizedOperationType)
            {
            case SynchronizedOperationType.Short:
                m_processItemOperation = new ShortSynchronizedOperation(TryProcessItem, OnProcessException);
                break;

            case SynchronizedOperationType.Long:
                m_processItemOperation = new LongSynchronizedOperation(TryProcessItem, OnProcessException);
                break;

            case SynchronizedOperationType.LongBackground:
                LongSynchronizedOperation processItemOperation = new LongSynchronizedOperation(TryProcessItem, OnProcessException);
                processItemOperation.IsBackground = true;
                m_processItemOperation            = processItemOperation;
                break;

            case SynchronizedOperationType.Mixed:
                m_processItemOperation = new MixedSynchronizedOperation(TryProcessItem, OnProcessException);
                break;

            default:
                throw new ArgumentOutOfRangeException("synchronizedOperationType");
            }
        }
Beispiel #3
0
 /// <summary>
 /// Creates a new instance of the <see cref="DoubleBufferedQueue{T}"/> class.
 /// </summary>
 public DoubleBufferedQueue()
 {
     m_lists    = new List <T> [2];
     m_lists[0] = new List <T>();
     m_lists[1] = new List <T>();
     m_swapLock = new SpinLock();
     m_processItemsOperation = new ShortSynchronizedOperation(TryProcessItems, OnProcessException);
 }
Beispiel #4
0
        /// <summary>
        /// Creates a new <see cref="AsyncQueue{T}"/>.
        /// </summary>
        /// <param name="synchronizedOperationType">The type of synchronized operation to use to process items in the queue.</param>
        public AsyncQueue(SynchronizedOperationType synchronizedOperationType)
        {
            m_asyncQueue = new ConcurrentQueue <T>();
            m_enabled    = 1;

            m_processItemOperation = synchronizedOperationType switch
            {
                SynchronizedOperationType.Short => new ShortSynchronizedOperation(TryProcessItem, OnProcessException),
                SynchronizedOperationType.Long => new LongSynchronizedOperation(TryProcessItem, OnProcessException),
                SynchronizedOperationType.LongBackground => new LongSynchronizedOperation(TryProcessItem, OnProcessException)
                {
                    IsBackground = true
                },
                _ => throw new ArgumentOutOfRangeException(nameof(synchronizedOperationType)),
            };
        }
Beispiel #5
0
 /// <summary>
 /// Creates a new <see cref="AsyncQueue{T}"/>.
 /// </summary>
 public AsyncQueue()
 {
     m_asyncQueue           = new ConcurrentQueue <T>();
     m_processItemOperation = new ShortSynchronizedOperation(TryProcessItem, OnProcessException);
     m_enabled = 1;
 }
 // Instantiates new task processors and puts them in the pool.
 private void CreateNewTaskProcessors(int count)
 {
     for (int i = 0; i < count; i++)
     {
         ISynchronizedOperation taskProcessor = default !;
Beispiel #7
0
 public EventEmailType(Action <EventEmailParameters, List <Event> > sendEmailCallback)
 {
     m_triggeredEvents       = new ConcurrentQueue <Event>();
     m_sendEmailCallback     = sendEmailCallback;
     m_synchronizedOperation = new LongSynchronizedOperation(UpdateTimersAndSendEmail, HandleException);
 }