<.> Restreint simultanément dans l'opération d'E / S .NET
La programmation asynchrone offre un avantage significatif pour les tâches parallèles. Cependant, la gestion de la concurrence de ces opérations asynchrones est essentielle pour éviter la surcharge du système. Cet article traite des problèmes communs qui restreignent le nombre d'opérations d'E / S pour restreindre le nombre d'opérations d'E / S pour garantir les meilleures performances.
Question:
En l'absence de l'utilisation de demandes HTTP asynchrones simultanément pour obtenir plusieurs URL, le comportement par défaut consiste à créer un grand nombre de demandes simultanées. Cela peut entraîner l'épuisement des ressources et la baisse des performances. Le défi consiste à limiter la concurrence au seuil spécifié, comme 20 demandes à la fois.
Solution:
.NET 4.5 Beta a introduit un volume de signal asynchrone (Semaphoreslim), qui a fourni une méthode efficace pour contrôler l'accès simultané aux ressources. La méthode waitasync () nous permet de suspendre l'exécution de la méthode asynchrone suspendue précédemment avant le nombre de créneaux spécifiés. Exemple de code:
Dans ce code, la méthode waitasync () n'assure que 20 demandes à la fois. Lorsqu'une nouvelle demande est organisée, il attendra qu'il y ait une rainure à disponible. Une solution alternative pour utiliser la planification des tâches:
public async Task MyOuterMethod() { // 要获取的 URL 列表 string[] urls = { "http://google.com", "http://yahoo.com", ... }; // 创建一个节流器,将并发性限制为 20 个请求 SemaphoreSlim throttler = new SemaphoreSlim(initialCount: 20); // 初始化一个列表以存储所有异步任务 var allTasks = new List<Task>(); // 安排每个 URL 获取任务 foreach (var url in urls) { // 等待节流器中的一个槽可用 await throttler.WaitAsync(); // 在单独的线程池流中安排任务 allTasks.Add( Task.Run(async () => { try { using (var client = new HttpClient()) // 使用using语句确保HttpClient被正确释放 { var html = await client.GetStringAsync(url); } } finally { // 释放节流器中的槽 throttler.Release(); } })); } // 等待所有任务完成 await Task.WhenAll(allTasks); }
Une autre méthode implique l'utilisation de la planification basée sur TPL pour créer des tâches de liaison commandées. Ensuite, vous pouvez implémenter un planificateur de tâches personnalisé pour forcer l'exécution des restrictions simultanées. Pour plus d'informations, consultez des exemples de taskScheduler sur MSDN.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!