2017-02-23 6 views
0

Ich habe Windows-Dienst, der Anfragen erhalten kann, möchte ich in jeder Anfrage in getrennten Thread behandeln.ThreadPool oder Task.Factory

Ich möchte auch die Anzahl der Threads, d. H. Maximal 5 Threads begrenzen.

Und ich will für alle Threads warten, bevor ich die Anwendung der Nähe bin,

Was ist der beste Weg, das zu tun?

Was ich versucht:

for (int i = 0; i < 10; i++) 
     { 
      var i1 = i; 
      Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done")); 

     } 
     Task.WaitAll();//Not waiting actually for all threads, why? 

Auf diese Weise i die Anzahl der theads begrenzen?

Oder

var events = new ManualResetEvent[10]; 

     ThreadPool.SetMaxThreads(5, 5); 
     for (int i = 0; i < 10; i++) 
     { 
      var i1 = i; 
      ThreadPool.QueueUserWorkItem(x => 
      { 
       Test(i1.ToString()); 
       events[i1].Set(); 
      }); 
     } 

     WaitHandle.WaitAll(events); 

Es gibt einen anderen Weg, dies zu implementieren?

+0

Wie bekommen Sie Anfragen? Diese Art von Angelegenheiten. Es ist nicht so klar, dass Sie den Pool benutzen sollten. Und SetMaxThreads() ist app-global, Sie verhindern, dass die Threads Helfer-Threads abspalten. –

+0

* Sobald Sie 'new Thread()' eingeben, ist es vorbei; Ihr Projekt hat bereits Legacy-Code. * Parallelität in C# -Kochbuch, @StephenCleary - was auch für den 'ThreadPool' gilt –

+0

http://StackOverflow.com/questions/9315937/net-tpl-limited-concurrency-level-task-scheduler -mit-Task-Priorität, https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.maximumconcurrencylevel, ... –

Antwort

1

Task.WaitAll();//Not waiting actually for all threads, why? Sie müssen folgende

List<Task> tasks = new List<Task>(); 
for (int i = 0; i < 10; i++) 
     { 

      var i1 = i; 
      tasks.Add(Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done"))); 

     } 
    Task.WaitAll(tasks); 

Ich denke, dass Sie die Unterschiede zwischen Aufgabe und Faden machen sollte

Aufgabe sind keine Threads Aufgabe ist nur ein Versprechen von Ergebnis in der Zukunft und Ihr Code kann auf nur einem Thread ausgeführt werden, selbst wenn Sie viele Aufgaben geplant haben

Thread ist ein Low-Level-Konzept, wenn Sie ein Thr starten ead Sie wissen, dass es einen eigenen Thread wird Ich glaube, Sie erste implentation gut genug ist, um sicher zu sein, dass alle Ihre Code ausgeführt wird, aber Sie haben Task.Run zu verwenden, anstatt Task.Factory.StartNew

0

sollte Beide Ansätze funktionieren, weder eine Garantie dass jede Operation in einem anderen Thread ausgeführt wird (und das ist eine gute Sache). Die Steuerung der maximalen Anzahl der Threads ist eine andere Sache ...

Sie können die maximale Anzahl der Threads des ThreadPool mit SetMaxThreads festlegen. Denken Sie daran, dass diese Änderung global ist, Sie haben nur eine ThreadPool.

Der Standard TaskScheduler den Thread-Pool (außer in einigen besonderen Situationen, in denen es die taks inline auf dem gleichen Thread ausgeführt werden können, die sie ruft) verwenden, so die Parameter des ThreadPool verändert auch die Tasks beeinflussen.

Nun, beachten Sie, ich sagte Standard TaskScheduler. Sie können Ihre eigenen rollen, was Ihnen mehr Kontrolle darüber gibt, wie die Aufgaben ausgeführt werden. Es wird nicht empfohlen, eine benutzerdefinierte TaskScheduler zu erstellen (es sei denn, Sie brauchen es wirklich und Sie wissen, was Sie tun).


Für die eingebettete Frage:

Task.WaitAll();//Not waiting actually for all threads, why?

Um richtig Task.WaitAll Sie müssen aufrufen, um die Aufgaben, die Sie für die als Parameter warten wollen passieren.Es gibt keine Möglichkeit, implizit auf alle derzeit vorhandenen Aufgaben zu warten. Sie müssen angeben, auf welche Aufgaben Sie warten möchten.

+0

'ThreadPool.SetMaxThreads' hat einige Einschränkungen (die Zahl ist gebunden zu der Anzahl der Kerne, überschreibt IIS die Werte, ...) - [SmartThreadPool] (https://github.com/amibar/SmartThreadPool) könnte die bessere Option sein. –