2017-12-30 38 views
-1

Ich versuche ein Programm zu machen, das 500 Verbindungen (HTTP Request) zu einer Website simulieren kann. Also möchte ich wissen, wie man die http-Anfragefunktion multipliziert und sie alle zusammen laufen lässt, ohne viele Fäden manuell durch viele Befehle zu erstellen.Wie führe ich einen Befehl in vielen Threads in C#

+1

Erstellen Sie einfach 500 Async-Anfragen und warten Sie nicht auf sie. Dann benutze 'Task.WhenAll'. Sie werden jetzt von Threads abstrahiert. –

Antwort

5

Versuchen Sie unten Code, TaskFactory.FromAsync von der TPL verwenden.

Erstellt eine Aufgabe, die ein Paar beginnen und enden Methoden darstellt, die mit dem asynchronen Programmiermodell Muster entsprechen .

Wenn Sie durch Konsolenanwendung ausgeführt wird, sollten Sie warten alle parallel Aufgaben zu erledigen Task.WaitAll

 var tasks = new List<Task>(); 

     for (int i = 0; i < 500; i++) 
     { 
      tasks.Add(Task.Run(async() => 
      { 
       var request = WebRequest.Create("http://www.example.com"); 
       var response = (HttpWebResponse)await Task.Factory 
            .FromAsync<WebResponse>(request.BeginGetResponse, 
            request.EndGetResponse, 
            null); 
       Console.WriteLine($"Request {i} status is {response.StatusCode}"); 

      })); 
     } 

     try 
     { 
      // Wait for all the tasks to finish. 
      Task.WaitAll(tasks.ToArray()); 
     } 
     catch (AggregateException e) 
     { 
      for (int j = 0; j < e.InnerExceptions.Count; j++) 
      { 
       Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString()); 
      } 
     } 

mit Sie for Schleife mit Parallel.For ersetzen kann, wird es Aufgabe ausführen in Parallel

Parallel.For(1, 500, 
        index => { 
         // web request 
        }); 
+0

Aber Sie erwarten nie die Aufgaben, die ausgeführt werden. – john

+0

@John richtig, aber ich weiß nicht, OP-Haupt-Thread – programtreasures

+0

Ich würde immer noch argumentieren, dass Sie in irgendeiner Weise darauf warten sollte demonstrieren. Stellen Sie sich vor, er macht das von einer Konsolenanwendung aus. Es wird beendet, bevor alle Anforderungen abgeschlossen sind. – john

1

meinst du es?

for(int i=0;i<500;i++) 
{ 
    Task.Run(()=>YourFunc()); 
} 
Verwandte Themen