web-dev-qa-db-fra.com

Comment faire beaucoup de requêtes Web simultanées en utilisant async et attendre?

J'ai lu comment faire par Microsoft sur Comment: effectuer plusieurs demandes Web en parallèle en utilisant async et attendre (C #) et j'ai trouvé:

private async Task CreateMultipleTasksAsync()  
{  
    // Declare an HttpClient object, and increase the buffer size. The  
    // default buffer size is 65,536.  
    HttpClient client =  
        new HttpClient() { MaxResponseContentBufferSize = 1000000 };  

    // Create and start the tasks. As each task finishes, DisplayResults   
    // displays its length.  
    Task<int> download1 =   
        ProcessURLAsync("http://msdn.Microsoft.com", client);  
    Task<int> download2 =   
        ProcessURLAsync("http://msdn.Microsoft.com/library/hh156528(VS.110).aspx", client);  
    Task<int> download3 =   
        ProcessURLAsync("http://msdn.Microsoft.com/library/67w7t67f.aspx", client);  

    // Await each task.  
    int length1 = await download1;  
    int length2 = await download2;  
    int length3 = await download3;  

    int total = length1 + length2 + length3;  

    // Display the total count for the downloaded websites.  
    resultsTextBox.Text +=  
        string.Format("\r\n\r\nTotal bytes returned:  {0}\r\n", total);  
}  

Je comprends ce code, mais ma question est: comment puis-je le modifier pour le mettre à l'échelle, disons cent ou mille?

7
Buyo

Vous pouvez appeler des appels asynchrones en boucle. Chaque appel peut renvoyer une tâche, et vous devez attendre que toutes les tâches soient terminées

var requestInfoCollection = new RequestInfo[]
{
     new RequestInfo("http://url1","GET"),
     new RequestInfo("http://url2","GET"),
     new RequestInfo("http://url2","POST")
};
List<Task> tasks = new List<Task>();
foreach(var requestInfo in requestInfoCollection)
{
   tasks.Add(ProcessURLAsync(requestInfo))
}
Task.WaitAll(tasks);

Ce qui précède invoquera plusieurs requêtes et attendra les résultats, cependant async\wait est utile pour libérer le thread à l'application à utiliser lors de l'exécution d'appels externes (http, db etc ...). Mais la mise à l'échelle dépend de votre matériel et de l'architecture de votre application.

6
CreativeManix

Je ne peux pas commenter en raison de la restriction de mon compte, mais en réponse à la réponse de @ CreativeManix,

List<Task> tasks = new List<Task>();

Task.WaitAll(tasks) n'acceptera pas une liste de tâches. L'un de ses remplacements accepte un tableau de tâches.

Task.WaitAll(tasks.ToArray())
10
batuzai04123