吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1115|回复: 16
收起左侧

[求助] 求问一个C#多线程问题,主程序如何等待多个其他子线程完成后继续

[复制链接]
ilovecomputer66 发表于 2022-8-30 12:01
基本需求是这样的:有很多网页的图片需要下载

我设置为,每个网页的各个图片分别用一个线程同时去下载。

我想知道,代码该怎么写,能实现比如一个页面30个图,都下载完了。然后通知给主线程,然后主线程把图片存一下,然后开子线程现在第2个网页

不知道怎么高效的写这个代码。

我用了非常垃圾的做法,设了一个公共变量(还得加锁)。子线程下载完一个,给这个变量+1  。主线程while判断,这个公共变量=要下载的所有数量后,就知道全完成了
我这个方法太辣鸡了。主线程while,导致一个CPU占满

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hrpzcf 发表于 2022-8-30 12:19
本帖最后由 hrpzcf 于 2022-8-30 12:20 编辑

Task.Run(任务).ContinueWith(线程完成后);
这应是比较简单的了,更复杂的我也不会
萋小磊 发表于 2022-8-30 12:28
咬字分开念 发表于 2022-8-30 12:30
委托代{过}{滤}理不行吗.下载好通知后台方法就行了,不用while
 楼主| ilovecomputer66 发表于 2022-8-30 12:34
各位兄弟,能再详细点么?有没有demo能学习下
qiqiyihaha 发表于 2022-8-30 12:40
我感觉可以加个timer,,然后来进行操作
max0609 发表于 2022-8-30 13:01
用线程池去处理.
xiaovssha 发表于 2022-8-30 13:02
[C#] 纯文本查看 复制代码
                    //开始任务
                    int workThreadCount = 1;
                    ManualResetEvent[] _ManualEvents = new ManualResetEvent[workThreadCount];
                    for (int i = 0; i < workThreadCount; i++)
                    {
                        _ManualEvents[i] = new ManualResetEvent(false);
                        var name = i + "";
                        WaitCallback method = (u) => work(u);
                        ThreadPool.QueueUserWorkItem(method, _ManualEvents[i]);
                    }
                    WaitHandle.WaitAll(_ManualEvents);
                    //任务结束
凉游浅笔深画眉 发表于 2022-8-30 13:40
[C#] 纯文本查看 复制代码
/// <summary>
        /// 真实执行下载的线程
        /// </summary>
        /// <param name="objPath"></param>
        private static void DownLoadPicThread(object objPath)
        {
            //模拟下载图片
            Console.WriteLine($"下载图片:{objPath.ToString()}");
            Thread.Sleep(3000);
        }

        /// <summary>
        /// 独立线程,用于启动子线程
        /// </summary>
        private static void DownloadMain()
        {
            List<Task> tasks = new List<Task>();
            for (int i = 0; i < 30; i++)
            {
                Task task = new Task(DownLoadPicThread, i, TaskCreationOptions.LongRunning);
                task.Start();
                tasks.Add(task);
            }
            Task.WaitAll(tasks.ToArray());
            Console.WriteLine("所有线程都已执行完成");
        }
        static void Main(string[] args)
        {
            Task taskMain = new Task(DownloadMain);
            taskMain.Start();
            Console.ReadKey();
        }

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ilovecomputer66 + 1 + 1 我很赞同!

查看全部评分

coolcalf 发表于 2022-8-30 14:06
在这种线程的while里面,你一定要加上sleep以避免cpu占用过高.

对于这个需要,我觉得:
1.你需要对每个任务进行分解,是弄一个列表,比如有30个图,就是30个任务
2.开启指定数量的线程,比如5个,每个线程就是你的一名员工,他会lock任务表,取一个任务,去执行,完成后,回来再去查任务表,直接任务表中没有任务。

网上有个例子: C#多线程-模拟火车票卖票程序
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表