【问题标题】:How to properly execute multiple tasks in C#如何在 C# 中正确执行多个任务
【发布时间】:2022-06-16 00:39:10
【问题描述】:

我的程序有两个主要功能

  1. 将 URL 源下载到磁盘
  2. 处理来自磁盘的 URL 源

该列表大约有 200 万个 URL,我可以很好地下载它们,但进程任务在列表的大约 50% 处停止,我也无法调试应用程序,因为它在启动后大约 10 小时停止。

现在我正在批量处理 5k 的列表,然后将结果保存在 txt 文件中。

我正在使用 while 循环和 AsParallel

#我发布完整的空白

private static List<(int id, string url, int rank, int status, int isautohttps, int disk, int db)> not_processed_hosts;

private static void process_hosts()
{
        not_processed_hosts = KnownHosts.GetLimitedNotProcessedHosts();
        
        while (not_processed_hosts.Count > 0)
        {
                          
            // Method 1  -  Note: Primary Method
            not_processed_hosts.AsParallel().ForAll(host => parseHost((host.id, host.url, host.rank, host.status, host.isautohttps, host.disk, host.db, 0, 0, 0)));

            // Method 2
            //Parallel.ForEach(not_processed_hosts, host =>{parseHost((host.id, host.url, host.rank, host.status, host.isautohttps, host.disk, host.db, 0, 0, 0));});

            save_all();
            not_processed_hosts = KnownHosts.GetLimitedNotProcessedHosts();
        }
        Console.WriteLine("Processing hosts finished");
    }

还有其他方法吗?

【问题讨论】:

  • 也许使用“旧式调试”:将进度消息写入某个日志文件 - 可能可以让您了解问题。所有网址都有效吗?
  • TPL DataFlow 对您来说可能很有趣。看起来您可以使用一些“管道”行为来控制并行性。这就是 DataFlow 为您提供的。
  • 您的 not_processed_hosts 源是否一次有 5k 行?你在这个盒子上有多少个处理器?您可以根据核心数量设置WithDegreeOfParallelism以减少影响。
  • 但是要在您当前的代码中找到错误,是的。 Hans 说:添加日志记录。
  • 请将完整的方法代码与GetLimitedNotProcessedHosts(包括它们的类型)一起发布,以便我们知道正在使用的方法。

标签: c# parallel-processing


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2016-02-21
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多