OK tutaj moje pytanie. Chcę rozpocząć wątki do pewnej liczby. Powiedzmy, że 100. Więc zacznie zaczynać wątki i sprawdzać ciągle liczbę uruchomionych wątków. Gdy osiągnięta liczba maksymalna przestanie zaczynać nowe wątki. Ale z odpowiednim interwałem sprawdzania lub zakończonym wątkiem zasygnalizuje i rozpocznie nowy wątek.Jak ustawić pewną liczbę wątków działających cały czas
W ten sposób zawsze będę mieć określoną liczbę uruchomionych wątków.
Udało mi się to przy użyciu snu i na stałe podczas. Sprawdzam więc całkowitą liczbę wątków w danym przedziale i jeśli wątek jest zakończony, wyrzuć go i rozpocznij nowy.
Ale moje rozwiązanie nie przychodzi mi właściwie. Przypuszczam, że byłoby lepiej, gdyby zakończony wątek zasygnalizował, a następnie sprawdzanie uruchomiłoby nowy, gdybyśmy byli poniżej maksymalnej liczby progów wątków.
Widziałem wiele przykładów wątków, ale większość z nich nie zawiera żadnego buforowania w kolejce z maksymalną ilością uruchomionych wątków. Chodzi mi o to, że oni po prostu zaczynają wątki, dopóki nie skończą. Ale powiedzmy, że mam 500k adresów do zbioru. Nie mogę po prostu uruchomić ich wszystkich w pętli for z pulą wątków.
platforma C# 4.5 aplikacji WPF
A tu poniżej jest moje rozwiązanie. Właściwie szukam lepszego. Nie poprawiam tego.
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()
{
}
"Nie mogę po prostu uruchomić ich wszystkich w pętli for z pulą wątków." - czy naprawdę próbowałeś? Uruchomienie wielu wątków z założeniem, że sprawi, że twoje ogólne połączenie internetowe będzie szybsze, nie brzmi "tak jak należy". Także conisder używający operacji asynchronicznych - nie będzie potrzebował tylu wątków ... Jeśli nie masz czegoś takiego jak maszyna 32-rdzeniowa ... –