Mam niektóre ConcurrentQueue, które zawierają Action (System.Action). Każda akcja w tej kolejce musi być uruchomiona (trzeba wywołać za pomocą polecenia invoke).Jak ograniczyć liczbę aktywnych zadań uruchomionych za pomocą równoległej biblioteki zadań?
Gdy kolejka nie jest pusta => akcja musi zostać wywołana => Ale chcę wprowadzić ograniczenie liczby zadań równoległych, które będą uruchamiane. Oprócz tego w każdej kolejce można dodać nową akcję.
Jak to zrobić?
(przy użyciu .NET 4.0)
napisałem coś, ale nie na pewno jest to najlepsze podejście
SemaphoreSlim maxThread = new SemaphoreSlim(5);
while(!actionQueue.IsEmpty)
{
maxThread.Wait();
Task.Factory.StartNew(() =>
{
Action action;
if(actionExecution.TryDequeue(out action))
{
action.Invoke();
}
},
TaskCreationOptions.LongRunning).ContinueWith((task) => maxThread.Release());
}
}
Czy możesz wyjaśnić prawdziwy problem? Dlaczego czujesz potrzebę ograniczenia liczby zadań? –
tylko akademickie doświadczenie .. chcę się uczyć. ale ja też chcę wiedzieć, dlaczego nie potrzebuję tego limitu? – Yanshof
Nie ma potrzeby ograniczania liczby zadań - widzę, że teraz mówisz o * jednoczesnym wykonywaniu * zadań, a nie całkowitej liczby w kolejce; Odpowiedź Lazyberezovsky'ego poniżej jest poprawna dla tego scenariusza. –