Task.Factory.StartNew lub Parallel.ForEach dla wielu długotrwałych zadań? [duplikować]
Możliwy duplikat:
Parallel.ForEach vs Task.Factory.StartNew
Muszę uruchomić około 1000 zadań wThreadPool
co noc (liczba może rosnąć w przyszłości). Każde zadanie wykonuje długotrwałą operację (odczyt danych z usługi internetowej) i jestnie wymaga dużej mocy procesora. Async I/O
nie jest opcją dla tego konkretnego przypadku użycia.
Biorąc pod uwagęIList<string>
parametrów, muszęDoSomething(string x)
. Próbuję wybrać jedną z dwóch następujących opcji:
IList<Task> tasks = new List<Task>();
foreach (var p in parameters)
{
tasks.Add(Task.Factory.StartNew(() => DoSomething(p), TaskCreationOptions.LongRunning));
}
Task.WaitAll(tasks.ToArray());
LUB
Parallel.ForEach(parameters, new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount*32}, DoSomething);
Która opcja jest lepsza i dlaczego?
Uwaga :
Odpowiedź powinna zawierać porównanie użyciaTaskCreationOptions.LongRunning
iMaxDegreeOfParallelism = Environment.ProcessorCount * SomeConstant
.