public void QueueData(byte[] data)
        {
            if (!Started)
            {
                throw new InvalidOperationException("Unable to queue element: Queue processing is not running");
            }

            Logger.Trace("Queue new element {0}", data.GetHashCode());

            DataQueue.Enqueue(data);
            DataAvailableEvent.Set();
        }
        private async Task ProcessQueue(Stream stream)
        {
            while (true)
            {
                await Task.WhenAny(DataAvailableEvent.WaitOneAsync(), StopEvent.WaitOneAsync());

                if (!StopEvent.WaitOne(0))
                {
                    byte[] data;
                    if (!DataQueue.TryDequeue(out data))
                    {
                        Logger.Trace("Unable to deque element from Queue due to concurrency access");
                    }

                    if (DataQueue.IsEmpty)
                    {
                        Logger.Trace("Writing queue is empty. Wait for new element...");
                        DataAvailableEvent.Reset();
                    }

                    try
                    {
                        Logger.Trace("Write queue element {0}", data.GetHashCode());
                        await stream.WriteAsync(data, 0, data.Length);
                    }
                    catch (Exception e)
                    {
                        Logger.Debug(e, "Unable to send data");
                        QueueData(data);

                        break;
                    }
                }
                else
                {
                    Logger.Trace("Queue  is stopped");
                    StopEvent.Reset();
                    break;
                }
            }
        }
Пример #3
0
        public async Task <T> Dequeue(TimeSpan?timeout = null)
        {
            if (!await WaitHandle.WaitOneAsync(timeout).ConfigureAwait(false))
            {
                throw new TimeoutException("Unable to dequeue element. Timeout has reached");
            }

            T value;

            if (!Queue.TryDequeue(out value))
            {
                return(await Dequeue(timeout));
            }

            if (Queue.IsEmpty)
            {
                DataAvailableEvent.Reset();
            }

            return(value);
        }
Пример #4
0
 public void Enqueue(T data)
 {
     Queue.Enqueue(data);
     DataAvailableEvent.Set();
 }
Пример #5
0
 private void TriggerCallback(EventArgs e)
 {
     DataAvailableEvent?.Invoke(this, e);
 }