c# Task多线程并行任务中等待所有线程都执行完成

C#多线程中如何等待所有线程的任务都执行完成呢?在.net 4.0以4.0+中,有Task.WaitAll(params Task[] tasks)方法来等待所有Task[],而不需要更多的操作。按照微软官方的文档,我写了一个实例来调试和说明:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp
{
  class Program
  {

    static void Main(string[] args)
    {
      var bookShop = new BookShop();
      bookShop.Run();
    }

  }

  pulic class Book
  {
    public int Id { get; set; }

    public string Name { get; set; }
  }
  public class BookShop
  {
    Random rand = new Random();
    Queue<Book> queueBook = new Queue<Book>();
    int Max = 10000;
    int EachCount = 500;
    int Cur = 0;

    void LoadData()
    {
      if (Cur >= Max)
      {
        //when Cur>=Max,return
        Console.WriteLine("Reached max value!");
        return;
      }
      Console.WriteLine("Loading data...");
      for (int i = Cur; i < EachCount + Cur; i++)
      {
        Thread.Sleep(10);
        Console.Write(i + " ");
        //insert data into Queue<Book>
        queueBook.Enqueue(new Book { Id = i, Name = "Name_" + i });
      }
      Console.WriteLine("");
      Cur += EachCount;
      Console.WriteLine("Data loaded successful,{0}...", queueBook.Count);
    }

    public void Run()
    {
      LoadData();

      Console.WriteLine("Tasks have started...");
      do
      {
        Task[] tasks = new Task[10];
        for (int i = 0; i < 10; i++)
        {
          tasks[i] = Task.Factory.StartNew(() => DoSomeWork(1000 * 1));
        }
        //// Wait for all tasks to complete.
        Task.WaitAll(tasks);
        //when Queue<Book> is empty,reload data...
        LoadData();
      } while (queueBook.Count > 0);
      //when Cur>=Max,break the while loop
      Console.WriteLine("All tasks have completed.");

      Console.ReadKey();
    }

    void DoSomeWork(int val)
    {
      while (queueBook.Count > 0)
      {
        var m = queueBook.Dequeue();
        Console.WriteLine("DoSomeWork start,i={0},Current thread id:{1}...", m.Id, Thread.CurrentThread.ManagedThreadId);
        var sleep = rand.Next(10, 200);
        // Pretend to do something.
        Thread.Sleep(sleep);
        Console.WriteLine("DoSomeWork has completed,sleep:{0},i={1}", sleep, m.Id);
      }
    }
  }
}

原文地址:https://www.cnblogs.com/zoumm/p/11973830.html

时间: 2024-10-10 23:40:32

c# Task多线程并行任务中等待所有线程都执行完成的相关文章

java中等待所有线程都执行结束

转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原文如下http://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&a

多线程ManualResetEvent、等待所有线程

需求:成员A可能有几十个,我需要更新所有的A,然后根据A的数据,去更新成员B. 解决方案:思路是想通过多线程更新所有的A,然后通过等待线程来确定所有的A是否都更新完,最后更新B. Member B = ....;//B成员的model IList<Member> list = ......;//查出所有的A成员,装进list里. ManualResetEvent[] manualEvents = new ManualResetEvent[list.Count]; //更新所有的A成员 for

多线程之美4一 线程池执行原理浅析

目录结构 引言 一.线程池工作流程图 二.线程池的运行原理 三.线程池的7个参数 四.常用4个阻塞队列 五.四个拒绝策略语义以及测试用例 六.Executors工具类 6.1. Executors提供的三种线程池 6.2 实际开发中应该怎样设定合适线程池? 七.线程池提交任务的2种 八.总结 引言 ? 我们为什么要使用线程池,它可以给我们带来什么好处?要想合理使用线程池,我们需要对线程池的工作原理有深入的理解和认识,让我们一起来看看吧. 好处: ? 1.处理响应快,不用每次任务到达,都需要等待初

java 多线程 , 等待所有子线程都执行完后 , 在执行主线程(其中的一种 , 也是个人觉得最好用的一种)

public static void main(String[] args) throws InterruptedException { // Runtime.getRuntime().availableProcessors() 获取可用的cpu数量 int count = Runtime.getRuntime().availableProcessors(); //创建一个指定线程数量的线程池 ExecutorService executorService = Executors.newFixe

【多线程】获取多个线程任务执行完事件

参考链接: 判断线程池中的线程是否全部执行完毕

delphi中等待外部应用程序执行完成后,再继续执行自有代码段

下面是两个函数,用来执行一个外部程序,缺省是异步执行 同步调用方法 RunProgram('c:\aa.exe',true); 参考IsProgram_Runing函数,你也可以调用RunProgram('c:\aa.exe')先异步执行,然后根据返回的进程句柄,自己判断程序是否执行结束. // 异步执行 function RunProgram(ProgramName:string;Wait:Boolean=False):Cardinal; var StartInfo:STARTUPINFO;

Java多线程01(Thread类、线程创建、线程池)

Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 1.1.2 单线程程序 - 从入口m

JAVA多线程编中的轮询锁与定时锁

显示锁                                                                                     Lock接口是Java 5.0新增的接口,该接口的定义如下: 1 2 3 4 5 6 7 8 publicinterface Lock {     void lock();     void lockInterruptibly() throws InterruptedException;     boolean tryLo

java多线程编程(1) 线程的基本知识

在前面研究过多线程与进程的区别. 这里在稍微总结一下: 进程:程序动态的一次执行过程. 线程:可以只是程序员的一部分的执行过程 每个进程有多个线程组成,在java程序中,至少两个线程一个是垃圾回收线程和main线程. 线程占有的资源更少,早java中就是每个线程都有自己的工作区,就是有自己独立的栈空间.多个线程共享一些内存资源,堆是共享的. 多线程的力度小,并发度高,这样系统的吞吐量就很大,只有好处吗?调度和执行线程是需要资源的,就是像是数据库中的索引和数据库中的锁一个道理,并发会带来什么问题呢