ilovecomputer66 发表于 2022-8-30 12:01

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

基本需求是这样的:有很多网页的图片需要下载

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

我想知道,代码该怎么写,能实现比如一个页面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

Thread Join

咬字分开念 发表于 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

                  //开始任务
                  int workThreadCount = 1;
                  ManualResetEvent[] _ManualEvents = new ManualResetEvent;
                  for (int i = 0; i < workThreadCount; i++)
                  {
                        _ManualEvents = new ManualResetEvent(false);
                        var name = i + "";
                        WaitCallback method = (u) => work(u);
                        ThreadPool.QueueUserWorkItem(method, _ManualEvents);
                  }
                  WaitHandle.WaitAll(_ManualEvents);
                  //任务结束

凉游浅笔深画眉 发表于 2022-8-30 13:40

/// <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();
      }

coolcalf 发表于 2022-8-30 14:06

在这种线程的while里面,你一定要加上sleep以避免cpu占用过高.

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

网上有个例子: C#多线程-模拟火车票卖票程序
页: [1] 2
查看完整版本: 求问一个C#多线程问题,主程序如何等待多个其他子线程完成后继续