示例#1
0
        private object DoLockedProcess(ProcessAction action)
        {
            object result = null;

            lock (locker)
            {
                bool   isSended     = false;
                Thread clientThread = new Thread(new ThreadStart(() =>
                {
                    result   = action.Invoke();
                    isSended = true;
                }));
                clientThread.Start();

                int counter = 0;
                while (counter * 100 <= delay)
                {
                    Thread.Sleep(100);
                    counter++;
                    if (isSended)
                    {
                        break;
                    }
                }
                if (!isSended)
                {
                    clientThread.Abort();
                }
            }
            return(result);
        }
示例#2
0
        /// <summary>
        /// The main engine which executes as an infinite loop until it is cancelled or
        /// the queue becomes empty
        /// </summary>
        public void Dequeue()
        {
            while (true)
            {
                if (CancelToken.IsCancellationRequested)
                {
                    CancelToken.ThrowIfCancellationRequested();
                }

                var tasks = CollectActions();

                if (tasks.Count > 0)
                {
                    ProcessAction?.Invoke(new QueueServiceEventArgs(
                                              tasks.Count, EQueueServiceState.BeforeExecute));

                    if (CancelToken.IsCancellationRequested)
                    {
                        CancelToken.ThrowIfCancellationRequested();
                    }

                    Parallel.ForEach(tasks, task => task.ActionMethod());

                    ProcessAction?.Invoke(new QueueServiceEventArgs(tasks.Count,
                                                                    EQueueServiceState.CompletedExecute));
                }
                else if (MarkCompleted && _queue.Count <= 0)
                {
                    break;
                }
            }
        }
示例#3
0
        public void Dequeue()
        {
            while (true)
            {
                var tasks = new List <QueueAction>();
                for (int i = 0; i < maxParallelTasks; ++i)
                {
                    if (_queue.TryDequeue(out QueueAction action))
                    {
                        tasks.Add(action);
                    }
                }

                if (tasks.Count > 0)
                {
                    ProcessAction?.Invoke(new ProcessActionEventArgs(
                                              tasks.Count, true));
                    Parallel.ForEach(tasks, task => task.ActionMethod());

                    ProcessAction?.Invoke(new ProcessActionEventArgs(tasks.Count, false));
                }
                else if (Completed && _queue.Count <= 0)
                {
                    break;
                }
            }
        }
示例#4
0
        /// <summary>
        /// Add new task to the queue
        /// </summary>
        /// <param name="action"></param>
        public void Enqueue(Action action)
        {
            _queue.Enqueue(new QueueAction()
            {
                ActionMethod = action,
                Id           = _queue.Count
            });

            ProcessAction?.Invoke(new QueueServiceEventArgs(
                                      _queue.Count, EQueueServiceState.Enqueue));
        }