如何在C#中为自定义函数实现多线程批量分析网站?
解决方案:多线程批量处理网站分析并判断任务完成
一、控制并发数的两种实现方式
方式1:用SemaphoreSlim+Task.WhenAll(灵活适配异步场景)
这种方式适合需要精确控制并发数的异步场景,能避免线程浪费:
using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; public class SiteAnalyzer { public static int maxThreads = 100; private static SemaphoreSlim _semaphore; static async Task Main(string[] args) { Console.Title = "SearchSites v0.1"; // 一次性读取所有网站链接到列表,避免重复IO操作 var sites = new List<string>(File.ReadLines("test.txt")); _semaphore = new SemaphoreSlim(maxThreads); var taskList = new List<Task>(); foreach (var site in sites) { await _semaphore.WaitAsync(); // 启动异步任务,完成后释放信号量 taskList.Add(Task.Run(async () => { try { await json_callAsync(site); } finally { _semaphore.Release(); } })); } // 等待所有任务执行完毕 await Task.WhenAll(taskList); Console.WriteLine("所有网站分析完成,程序即将退出"); } // 你的网站分析异步函数 private static async Task json_callAsync(string siteUrl) { // 替换为你的实际分析逻辑 Console.WriteLine($"正在分析: {siteUrl}"); await Task.Delay(1000); // 模拟异步操作 Console.WriteLine($"完成分析: {siteUrl}"); } }
方式2:用Parallel.ForEachAsync(.NET 6+推荐)
.NET 6及以上版本提供了原生异步并行迭代方法,代码更简洁:
using System; using System.IO; using System.Threading.Tasks; public class SiteAnalyzer { public static int maxThreads = 100; static async Task Main(string[] args) { Console.Title = "SearchSites v0.1"; var sites = File.ReadLines("test.txt"); var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = maxThreads }; // 异步并行处理所有网站 await Parallel.ForEachAsync(sites, parallelOptions, async (site, token) => { await json_callAsync(site); }); Console.WriteLine("所有网站分析完成,程序即将退出"); } private static async Task json_callAsync(string siteUrl) { Console.WriteLine($"正在分析: {siteUrl}"); await Task.Delay(1000); Console.WriteLine($"完成分析: {siteUrl}"); } }
二、判断任务全部完成的核心逻辑
- 使用
Task.WhenAll(taskList):会阻塞当前线程直到传入的所有任务都执行完毕。 - 使用
Parallel.ForEachAsync:异步方法本身会等待所有迭代完成后才会继续执行后续代码。
两种方式都能确保程序在所有网站分析完成后,再执行后续的退出或清理操作。
内容的提问来源于stack exchange,提问作者Joseph Magdi
相关产品推荐
相关产品推荐

