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