Exemplo n.º 1
0
        private void DoWorkItem(ThreadExecutor <T> executor, T item)
        {
            ModuleProc PROC = new ModuleProc(DYN_MODULE_NAME, "DoWorkItem");

            try
            {
                if (!item.Equals(default(T)))
                {
                    try
                    {
                        if (executor != null)
                        {
                            ThreadExecutorItem <T> executorItem = new ThreadExecutorItem <T>(item);
                            executor.QueueWorkerItem(executorItem);
                            Interlocked.Increment(ref _activeWorkers);
                            this.ActiveWorkerThreadIncrement(executor.UniqueKey, item.UniqueKey);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Exception(PROC, ex);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Exception(PROC, ex);
            }
        }
        private void DoWorkItem(T item)
        {
            ModuleProc PROC = new ModuleProc(DYN_MODULE_NAME, "DoWorkItem");

            try
            {
                if (!item.Equals(default(T)))
                {
                    try
                    {
                        if (_workersFree.First != null)
                        {
                            ThreadExecutor <T>             executor       = _workersFree.First.Value;
                            string                         executorKey    = executor.UniqueKey;
                            string                         itemKey        = item.UniqueKey;
                            List <ThreadExecutorItem <T> > workerSequence = null;
                            _workersFree.RemoveFirst();

                            if (!_workersRunning.ContainsKey(executorKey))
                            {
                                _workersRunning.Add(executorKey, executor);
                            }
                            if (!_workerSequences.ContainsKey(itemKey))
                            {
                                _workerSequences.Add(itemKey, new List <ThreadExecutorItem <T> >());
                            }

                            workerSequence = _workerSequences[itemKey];
                            EventWaitHandle wh = null;
                            if (workerSequence.Count > 0)
                            {
                                //wh = new ManualResetEvent(false);
                                wh = executor.QueueSignal;
                                wh.Reset();
                            }

                            ThreadExecutorItem <T> executorItem = new ThreadExecutorItem <T>(item);
                            executorItem.WaitHandle = wh;
                            workerSequence.Add(executorItem);
                            executor.QueueWorkerItem(executorItem);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Exception(PROC, ex);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Exception(PROC, ex);
            }
        }