You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:45:01