/// <summary>
        /// Maksimum iþçi thread sayýsýný geçmeyecek þekilde yeni iþçi thread baþlatýr.
        /// Eðer havuz kapatýlýyor olarak iþaretlendi ise hiç iþçi thread baþlatmaz.
        /// </summary>
        /// <param name="threadsCount">Baþlatýlacak iþçi thread sayýsý.</param>
        private void TryStartNewThreads(int threadsCount)
        {
            OnWorkerThreadPoolTryingToStartNewWorkerThreads(new WorkerThreadPoolTryingToStartNewWorkerThreadsEventArgs(threadsCount));

            // Ýþçi thread listesi üzerinde iþlem yapýyoruz, dolayýsýyla baþka thread'lerin listeyi
            // deðiþtirmesini engellemek için listeyi kilitliyoruz.
            lock (m_WorkerThreads)
            {
                // Eðer havuz kapatýlýyor olarak iþaretlendi ise metoddan çýkýyoruz.
                if (m_IsShuttingdown)
                {
                    return;
                }

                for (int i = 0; i < threadsCount; i++)
                {
                    // Eðer mevcut iþçi thread sayýsý maksimum iþçi thread sayýsýndan fazla oldu ise metoddan çýkýyoruz.
                    if (m_WorkerThreads.Count >= m_MaxWorkerThreads)
                    {
                        return;
                    }

                    // Havuz numarasý ve thread numarasýna göre bir thread ismi belirliyoruz.
                    string threadName = string.Format(CultureInfo.CurrentCulture, "Labo WTP #{0} Thread #{1}", s_WorkerThreadPoolIdCounter, ++m_WorkerThreadIdCounter);

                    WorkerThread workerThread = new WorkerThread(this, m_WorkItemQueue, threadName, false);

                    // Yarattýðýmýz iþçi thread'i iþçi thread listesine ekliyoruz.
                    m_WorkerThreads.Add(workerThread);

                    OnWorkerThreadPoolStartingNewWorkerThread(new WorkerThreadPoolStartingNewWorkerThreadEventArgs(m_WorkerThreads.Count, workerThread));

                    // Ýþçi thread'i hemen baþlatýyoruz.
                    workerThread.Start();
                }
            }
        }
        /// <summary>
        /// Minimum - maksimum iþçi thread sayýsý ve iþ parçasý kuyruðunda bekleyen iþ parçasý 
        /// deðerlerine bakarak iþçi thread'in sonlandýrýlýp sonlandýrýlmayacaðýný söyler.
        /// </summary>
        /// <param name="workerThread">Ýþçi thread.</param>
        /// <param name="hasNoWorkItemsInQueue"></param>
        /// <returns>
        /// Eðer <c>true</c> dönerse iþçi thread, iþçi thread listesinden çýkartýlmýþ 
        /// demektir ve metodu çaðýran kiþi iþçi thread'i sonlandýrmak zorundýr. 
        /// <c>false</c> ise tersi.
        /// </returns>
        public bool ShouldExitWorkerThread(WorkerThread workerThread, bool hasNoWorkItemsInQueue)
        {
            // Ýþçi thread listesi üzerinde iþlem yapýyoruz, dolayýsýyla baþka thread'lerin listeyi
            // deðiþtirmesini engellemek için listeyi kilitliyoruz.
            lock (m_WorkerThreads)
            {
                // Eðer havuz kapatýlýyor olarak iþaretlendi ise iþçi thread'i hiç düþünmeden sonlandýrmamýz gerekiyor.
                if (m_IsShuttingdown)
                {
                    m_WorkerThreads.Remove(workerThread);

                    return true;
                }

                // Eðer kuyrukta bekleyen iþ parçasý var ise kriterimiz maksimum thread sayýsý, yoksa minimum thread sayýsý.
                // Çünkü boþta bekleyecek thread sayýsýný belirleyen faktör minimum thread sayýsý, meþgul olacak thread sayýsýný 
                // belirleyen faktör ise maksimum thread sayýsý.
                int threadLimit = hasNoWorkItemsInQueue ? m_MinWorkerThreads : m_MaxWorkerThreads;

                // Eðer mevcut iþçi thread sayýsý limiti aþýyor ise thread'i sonlandýrmamýz gerekiyor.
                if (m_WorkerThreads.Count > threadLimit)
                {
                    m_WorkerThreads.Remove(workerThread);

                    return true;
                }

                return false;
            }
        }