public QueryProcessorController GetAvailableFromPool(string Server, string Database, Guid newTaskId)
        {
            QueryProcessorController proc = null;
            int count    = 0;
            int maxCount = FI.Common.AppConfig.DA_OlapProcessorCount;

            // find avalailable
            while (true)
            {
                // check if it's canceled already
                if (IsTaskCanceled(newTaskId))
                {
                    throw new Exception("Task is canceled: " + newTaskId.ToString());
                }

                lock (this)
                {
                    for (int i = 0; i < _pool.Count; i++)
                    {
                        proc = (QueryProcessorController)_pool[i];
                        if (proc.Server == Server && proc.Database == Database)
                        {
                            count++;
                            if (!proc.IsAllocated)
                            {
                                proc.Allocate(newTaskId);
                                return(proc);
                            }
                        }
                    }

                    // if possible to add processor
                    if (count < maxCount)
                    {
                        proc = new QueryProcessorController(Server, Database);
                        _pool.Add(proc);

                        proc.Allocate(newTaskId);
                        return(proc);
                    }
                }


                // sleep till next loop
                System.Threading.Thread.Sleep(200);
            }
        }
        public void ReleaseByTaskId(Guid TaskId)
        {
            lock (this)
            {
                if (TaskId == Guid.Empty)
                {
                    throw new ArgumentException("Invalid TaskId:  Empty");
                }

                if (!_canceledTasks.Contains(TaskId.ToString()))
                {
                    _canceledTasks.Add(TaskId.ToString());
                }

                for (int i = 0; i < _pool.Count; i++)
                {
                    QueryProcessorController proc = (QueryProcessorController)_pool[i];
                    if (proc.TaskId == TaskId)
                    {
                        proc.Release(true);
                    }
                }
            }
        }