Ok qui la mia domanda. Voglio iniziare le discussioni fino a un certo numero. Diciamo 100. Quindi inizierà a iniziare i thread e controllerà continuamente il numero di thread in esecuzione. Quando raggiunge il numero massimo, smetterà di iniziare nuovi thread. Ma con un adeguato intervallo di controllo o thread completato segnalerà e inizierà la nuova discussione.Come fare un certo numero di thread sempre in esecuzione
Con questo modo, avrò sempre certo numero di thread in esecuzione.
Ho gestito questo con l'uso di sonno e permanente mentre. Quindi continuo a controllare il numero totale di thread in esecuzione con un determinato intervallo e, se il thread è completo, lo dispongo e ne avvio uno nuovo.
Ma la mia soluzione non è venuta a me come un modo corretto. Suppongo che sarebbe meglio se il thread completato segnalasse e quindi il controllore ne inizierebbe uno nuovo se siamo al di sotto del numero massimo di soglia dei thread.
ho visto molti esempi ThreadPool ma la maggior parte di loro non contiene alcuna coda pooling con importo massimo di thread in esecuzione. Quello che voglio dire è che continuano a iniziare le discussioni finché non sono terminate. Ma diciamo che ho 500k di url da raccogliere. Non posso solo avviarli tutti in un ciclo for con il pool di thread.
piattaforma è C# 4.5 applicazione WPF
E qui sotto è la mia soluzione. In realtà sto cercando uno migliore. Non migliorare questo.
private void Button_Click_4(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
startCrawler();
});
}
void startCrawler()
{
int irMaximumThreadcount = 100;
List<Task> lstStartedThreads = new List<Task>();
while (true)
{
for (int i = 0; i < lstStartedThreads.Count; i++)
{
if (lstStartedThreads[i].IsCompleted == true)
{
lstStartedThreads[i].Dispose();
lstStartedThreads.RemoveAt(i);
}
}
if (lstStartedThreads.Count < irMaximumThreadcount)
{
var vrTask = Task.Factory.StartNew(() =>
{
func_myTask();
});
lstStartedThreads.Add(vrTask);
}
System.Threading.Thread.Sleep(50);
}
}
void func_myTask()
{
}
"Non posso solo avviarli tutti in un ciclo for con pool di thread." - hai effettivamente provato? Avvio di più thread con l'ipotesi che renderà più veloce la connessione Internet globale non suona "come un modo corretto". Anche conisder usando operazioni asincrone - non avrà bisogno di molti thread ... A meno che tu non abbia qualcosa come la macchina 32-core ... –