示例#1
0
        public MutexQueue([NotNull] TQueue queue, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
            : base(options, token)
        {
            bool   createdNew;
            string name = Name.ToNullIfEmpty()?.LeftMax(Win32.MAX_PATH);

            if (name == null)
            {
                _mutex = new Mutex(false, null, out createdNew);
            }
            else
            {
                try
                {
                    _mutex     = Mutex.OpenExisting(name);
                    createdNew = false;
                }
                catch (WaitHandleCannotBeOpenedException)
                {
                    _mutex = new Mutex(false, name, out createdNew);
                }
            }

            IsOwner      = createdNew;
            _queue       = new QueueAdapter <TQueue, T>(queue);
            _allWorkDone = new ManualResetEvent(false);

            new Thread(Consume)
            {
                IsBackground = IsBackground,
                Priority     = Priority
            }.Start();
        }
示例#2
0
        public DataFlowQueue([NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
            : base(options, token)
        {
            _workCompletedEventSlim = new ManualResetEventSlim(false);

            // Define the mesh.
            _queue = new BufferBlock <T>(new DataflowBlockOptions
            {
                CancellationToken = Token
            });
            _processor = new ActionBlock <T>(e =>
            {
                ScheduledCallback?.Invoke(e);
                Run(e);
            }, new ExecutionDataflowBlockOptions
            {
                MaxDegreeOfParallelism = Threads,
                CancellationToken      = Token
            });
            _link = _queue.LinkTo(_processor, new DataflowLinkOptions
            {
                PropagateCompletion = true
            });
            Task.Run(Consume).ConfigureAwait();
        }
 public BlockingCollectionQueue([NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
     : base(options, token)
 {
     _queue            = new BlockingCollection <T>();
     _workStartedEvent = new AutoResetEvent(false);
     _countdown        = new CountdownEvent(1);
     _workers          = new Thread[Threads];
 }
示例#4
0
 public WaitAndPulseQueue([NotNull] TQueue queue, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
     : base(options, token)
 {
     _queue            = new QueueAdapter <TQueue, T>(queue);
     _workStartedEvent = new AutoResetEvent(false);
     _countdown        = new CountdownEvent(1);
     _workers          = new Thread[Threads];
 }
示例#5
0
 public TaskGroupQueue([NotNull] TQueue queue, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
     : base(options, token)
 {
     _queue     = new QueueAdapter <TQueue, T>(queue);
     _countdown = new CountdownEvent(1);
     new Thread(Consume)
     {
         IsBackground = IsBackground,
         Priority     = Priority
     }.Start();
 }
 public SemaphoreSlimQueue([NotNull] TQueue queue, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
     : base(options, token)
 {
     _queue       = new QueueAdapter <TQueue, T>(queue);
     _allWorkDone = new ManualResetEvent(false);
     _semaphore   = new SemaphoreSlim(Threads);
     new Thread(Consume)
     {
         IsBackground = IsBackground,
         Priority     = Priority
     }.Start();
 }
示例#7
0
        public SemaphoreQueue([NotNull] TQueue queue, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
            : base(options, token)
        {
            bool   createdNew;
            string name = Name.ToNullIfEmpty()?.LeftMax(Win32.MAX_PATH);

            if (name == null)
            {
                _semaphore = new Semaphore(Threads, Threads, null, out createdNew);
            }
            else
            {
                try
                {
                    _semaphore = Semaphore.OpenExisting(name);
                    createdNew = false;
                }
                catch (WaitHandleCannotBeOpenedException)
                {
                    _semaphore = new Semaphore(Threads, Threads, name, out createdNew);
                }
            }

            if (createdNew && options is SemaphoreQueueOptions <T> {
                Security : { }
            } semaphoreQueueOptions)
            {
                // see https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore.openexisting for examples
                _semaphore.SetAccessControl(semaphoreQueueOptions.Security);
            }

            IsOwner      = createdNew;
            _queue       = new QueueAdapter <TQueue, T>(queue);
            _allWorkDone = new ManualResetEvent(false);
            new Thread(Consume)
            {
                IsBackground = IsBackground,
                Priority     = Priority
            }.Start();
        }
示例#8
0
 /// <inheritdoc />
 public SynchronizedProducerQueue(ThreadQueueMode mode, [NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
 {
     _queue         = ProducerConsumerQueue.Create(mode, options, token);
     _producerQueue = _queue as IProducerQueue <TQueue, T> ?? throw new NotSupportedException();
 }
示例#9
0
 /// <inheritdoc />
 public EventQueue([NotNull] ProducerConsumerQueueOptions <T> options, CancellationToken token = default(CancellationToken))
     : base(new Queue <T>(), options, token)
 {
 }