/// <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; } }