2013-07-16 14 views
7

Ich habe einige ConcurrentQueue die Aktion enthalten (System.Action). Jede Aktion in dieser Warteschlange muss ausgeführt werden (muss mit invoke aufgerufen werden).Wie kann die Anzahl der aktiven Aufgaben begrenzt werden, die über die Parallel Task Library ausgeführt werden?

Wenn die Warteschlange nicht leer ist => müssen die zu ergreifenden aufrufen => Aber ich möchte einige Begrenzung für die Anzahl der parallelen Aufgabe machen, die ausgeführt wird. Darüber hinaus kann jederzeit eine neue Aktion zur Warteschlange hinzugefügt werden.

Wie geht das?

(mit .net 4.0)

ich etwas geschrieben, aber ich nicht sicher, dies ist der beste Ansatz

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()); 
     } 
    } 
+2

Können Sie das eigentliche Problem erklären? Warum haben Sie das Bedürfnis, die Anzahl der Aufgaben zu begrenzen? –

+0

nur akademische Erfahrung .. Ich möchte lernen. aber ich möchte auch wissen, warum ich diese Grenze nicht machen muss? – Yanshof

+1

Es besteht keine Notwendigkeit, die Anzahl der Aufgaben zu beschränken - ich sehe jetzt sind Sie sprechen * gleichzeitig ausgeführten * Aufgaben und nicht die Gesamtzahl in der Warteschlange; Die Antwort von lazyberezovsky ist die richtige für dieses Szenario. –

Antwort

14

Werfen Sie einen Blick auf angeben MSDN-Artikel How to: Create a Task Scheduler That Limits Concurrency. Sie können LimitedConcurrencyLevelTaskScheduler Implementierung davon verwenden, um Ihren Code wie folgt zu machen:

+0

Warum ist das besser als die Lösung, die das OP schlug vor, SemaphoreSlim zu verwenden? – BornToCode

-1

Sie müssen ParallelOptions

ParallelOptions options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 4;//value of your choice 

if (Parallel.ForEach(PDFFiles, options, element => 
{ 
    //do work 
} 
+1

Außer es hier keine ForEach ist .... –

+0

Dies ist nicht auf Aufgaben im Zusammenhang ... –

Verwandte Themen