Exemple #1
0
        private void ProcessItem()
        {
            var currentThread = new Thread((state) =>
            {
                var item = default(T);
                while (_enabled)
                {
                    try
                    {
                        try
                        {
                            item = _queue.Take(_canCellToken);
                            ProcessItemEvent?.Invoke(item);
                        }
                        catch (OperationCanceledException ex)
                        {
                            //Console.WriteLine(JsonConvert.SerializeObject(ex));
                        }
                    }
                    catch (Exception ex)
                    {
                        OnProcessException(ex, item);
                    }
                }
            });

            _threadCollection.Add(currentThread);
        }
Exemple #2
0
        private void ConsumeItem()
        {
            var waitHandles = new WaitHandle[]
            {
                _newItemEvent,
                _shutdownEvent
            };
            var itemWaitHandles = new WaitHandle[]
            {
                _itemCompleteEvent,
                _shutdownEvent2
            };

            var done = false;

            while (done == false && !IsClosing)
            {
                // block and wait for the items gets to the queue
                switch (WaitHandle.WaitAny(waitHandles))
                {
                case 0:     // New item
                {
                    var _newList = new List <T>();
                    T   _current;
                    lock (_syncObject)
                    {
                        _current = _Items.Last();
                        if (_current == null)
                        {
                            throw new Exception("There must always be at least 1 item in the Queue");
                        }
                        if (_Items.Count > 1)
                        {
                            _newList.Add(_Items[_Items.Count - 1]);
                        }
                        _Items = _newList;
                    }

                    ProcessItemEvent?.Invoke(_current);
                    WaitHandle.WaitAny(itemWaitHandles);
                }
                break;

                case 1:     // Told to exit
                    done = true;
                    break;
                }
            }
            _shutdownAckEvent.Set();
        }
Exemple #3
0
        public void Flush()
        {
            StopProcess();

            while (_queue.Count != 0)
            {
                if (!_queue.TryTake(out var item))
                {
                    continue;
                }
                try
                {
                    ProcessItemEvent?.Invoke(item);
                }
                catch (Exception ex)
                {
                    OnProcessException(ex, item);
                }
            }
        }
        private void ConsumeItem()
        {
            var waitHandles = new WaitHandle[]
            {
                _newItemEvent,
                _shutdownEvent
            };
            var done = false;

            while (done == false)
            {
                // block and wait for the items gets to the queue
                switch (WaitHandle.WaitAny(waitHandles))
                {
                case 0:     // New item
                {
                    Queue <T> itemsToProcess;
                    var       newQueue = new Queue <T>(QUEUE_START_SIZE);

                    lock (_queueSyncObject)
                    {
                        itemsToProcess  = _queuedMessages;
                        _queuedMessages = newQueue;
                    }
                    foreach (var item in itemsToProcess)
                    {
                        ProcessItemEvent?.Invoke(item);
                    }
                }
                break;

                case 1:     // Told to exit
                    done = true;
                    break;
                }
            }
            _shutdownAckEvent.Set();
        }