protected virtual void InternalStart(IList <T> jobsTodo)
        {
            while (Working)
            {
                eventLock.WaitOne();

                while (CurrentConcurrentWorkers < MaxConcurrentWorkers && CurrentWork < jobsTodo.Count && Working)
                {
                    var work = workerFactory.CreateWorker(jobsTodo[CurrentWork]);

                    lock (objectLock)
                        currentWorkers.Add(work);

                    work.WorkCompleted += WorkCompleted;
                    work.StartWork();

                    Interlocked.Increment(ref CurrentConcurrentWorkers);
                    Interlocked.Increment(ref CurrentWork);
                }

                eventLock.Reset();

                lock (objectLock)
                {
                    if (CompletedWorks != jobsTodo.Count)
                    {
                        continue;
                    }

                    OnWorksCompleted(CompletedWorks);
                    Working = false;
                    break;
                }
            }
        }
Exemple #2
0
 private IEnumerable <IWorker> MakeWorkers()
 {
     for (int i = 0; i < _config.quantity; i++)
     {
         yield return(_factory.CreateWorker(i));
     }
 }
Exemple #3
0
        void AddWorker()
        {
            lock (_workers)
            {
                var workerName = string.Format("Rebus {0} worker {1}", _busId, _workers.Count + 1);
                _log.Debug("Adding worker {0}", workerName);

                try
                {
                    var worker = _workerFactory.CreateWorker(workerName);
                    _workers.Add(worker);
                }
                catch (Exception exception)
                {
                    throw new RebusApplicationException(string.Format("Could not create {0}", workerName), exception);
                }
            }
        }
Exemple #4
0
        void AddWorker()
        {
            lock (_workers)
            {
                var workerName = $"Rebus {_busId} worker {_workers.Count + 1}";

                _log.Debug("Adding worker {0}", workerName);

                try
                {
                    var worker = _workerFactory.CreateWorker(workerName);
                    _workers.Add(worker);
                }
                catch (Exception exception)
                {
                    throw new RebusApplicationException(exception, $"Could not create {workerName}");
                }
            }
        }
        public Task <ThreadLog <TOut> >[] BuildTasksTab <TOut>(int nbTasks, IWorkerFactory <TOut> factory)
        {
            var tasks = new Task <ThreadLog <TOut> > [nbTasks];

            ThreadLog <TOut> DoWork(int TaskId)
            {
                var log = new ThreadLog <TOut>();

                log.SetThreadId();
                log.TaskId = TaskId;
                // double parenthesis due to that the factory ouput a functor that can be called.
                log.Result = factory.CreateWorker()();
                return(log);
            }

            for (int taskId = 0; taskId < nbTasks; taskId++)
            {
                // you realy should pay attention here ;)
                tasks[taskId] = Task <ThreadLog <TOut> > .Factory.StartNew(() => DoWork(taskId));
            }
            return(tasks);
        }
            public IWorker CreateWorker(string workerName)
            {
                NumberOfWorkersCreated++;

                return(_workerFactory.CreateWorker(workerName));
            }