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?
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.
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())