Ejemplo n.º 1
0
        public SingleThreadedRelayQueueWorker(string name, Action <TItem> action, ThreadPriority threadPriority, bool markThreadAsBackground, ApartmentState?apartmentState, ILoggerWithStackTrace debugLogger)
        {
            _syncRunFlags    = new object();
            _syncUserActions = new object();

            _items       = new ConcurrentQueue <TItem>();
            _name        = name;
            _action      = action ?? throw new ArgumentNullException(nameof(action));
            _debugLogger = debugLogger ?? throw new ArgumentNullException(nameof(debugLogger));

            _threadNotifyAboutQueueItemsCountChanged = new AutoResetEvent(false);

            _isRunning     = true;
            _mustBeStopped = false;

            _workThread = new Thread(WorkingThreadStart)
            {
                IsBackground = markThreadAsBackground, Priority = threadPriority, Name = name
            };
            if (apartmentState.HasValue)
            {
                _workThread.SetApartmentState(apartmentState.Value);
            }
            _workThread.Start();
        }
        public SingleThreadPriorityAsyncStarter(string name, ThreadPriority threadPriority, bool markThreadAsBackground, ApartmentState?apartmentState, ILoggerWithStackTrace debugLogger, int maxFlow, int queuesCount, bool isWaitAllTasksCompleteNeededOnStop)
        {
            _name        = name;
            _debugLogger = debugLogger ?? throw new ArgumentNullException(nameof(debugLogger));
            _maxFlow     = maxFlow;
            _isWaitAllTasksCompleteNeededOnStop = isWaitAllTasksCompleteNeededOnStop;

            _flowCounter            = new WaitableCounter();
            _asyncActionQueueWorker = new SingleThreadedRelayMultiQueueWorker <Action>(_name, a => a(), threadPriority, markThreadAsBackground, apartmentState, debugLogger, queuesCount);
        }