C#多线程等待所有子线程结束的示例

C#中,多线程编程是常见的需求。其中,一个常见的问题是如何等待所有子线程结束。在本文中,我们将演示两个示例来解决这个问题。

示例一:使用Thread.Join方法

使用Thread.Join方法是一种常见的等待子线程完成的方式。以下是示例代码:

public static void Main()
{
    var threads = new List<Thread>();

    for (int i = 0; i < 5; i++)
    {
        var thread = new Thread(() =>
        {
            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} started");
            Thread.Sleep(1000);
            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} ended");
        });

        thread.Start();
        threads.Add(thread);
    }

    foreach (var thread in threads)
    {
        thread.Join();
    }

    Console.WriteLine("All threads ended");
}

在此示例中,我们创建了5个线程,并使用Thread.Join方法等待所有子线程完成。在每个子线程中,我们使用Thread.Sleep模拟一些耗时操作。

在调用Thread.Join方法之前,我们将所有子线程存储在一个List中。然后,我们使用foreach循环按顺序等待每个线程完成。

示例二:使用Task.WaitAll方法

另一个等待子线程完成的方法是使用Task.WaitAll方法。以下是示例代码:

public static void Main()
{
    var tasks = new List<Task>();

    for (int i = 0; i < 5; i++)
    {
        var task = Task.Run(() =>
        {
            Console.WriteLine($"Task {Task.CurrentId} started");
            Thread.Sleep(1000);
            Console.WriteLine($"Task {Task.CurrentId} ended");
        });

        tasks.Add(task);
    }

    Task.WaitAll(tasks.ToArray());

    Console.WriteLine("All tasks ended");
}

在这个示例中,我们使用Task.Run方法创建了5个任务,并使用Task.WaitAll方法等待所有任务完成。在每个任务中,我们使用Thread.Sleep模拟一些耗时操作。

在创建任务后,我们将它们存储在一个List中。在等待任务完成时,我们使用Task.WaitAll方法,并将任务数组传递给它。

结论

这两个示例展示了在C#中等待多个线程/任务完成的两种常见方法。无论你是使用Thread.Join方法还是Task.WaitAll方法,都可以轻松地等待多个线程。

希望这篇文章能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程等待所有子线程结束的示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • ThreadLocal 在上下文传值场景实践源码

    ThreadLocal 是 Java 中常用的多线程编程技术之一,它可以在多个线程环境中保存并传递数据,将数据与线程绑定在一起,实现线程的局部变量。在一些上下文传值的场景中,ThreadLocal 可以较为方便的实现参数的传递。接下来,本文将详细讲解 ThreadLocal 在上下文传值场景实践源码的完整攻略。 什么是 ThreadLocal ThreadL…

    C# 2023年6月7日
    00
  • 将字符串转换成System.Drawing.Color类型的方法

    将字符串转换成System.Drawing.Color类型的方法可以使用System.Drawing.Color类中的静态方法ColorTranslator.FromHtml或ColorTranslator.FromName。 1. 使用ColorTranslator.FromHtml方法 string htmlColor = "#FF0000&q…

    C# 2023年6月7日
    00
  • c#委托与事件(详解)

    C#委托与事件(详解) 什么是委托? 在C#中,委托是一个类,用于指向和调用一个或多个方法。可以将委托看做是方法的类型。通过委托,我们可以在运行时确定要调用哪个方法,而无需提前确定调用哪个方法。 如何定义委托? 在C#中,委托的定义非常简单,只需使用delegate关键字即可。 delegate 返回类型 委托名称(参数列表); 其中, 返回类型:委托指向方…

    C# 2023年6月1日
    00
  • C#生成不重复随机字符串类

    C#生成不重复随机字符串类可以通过以下几个步骤来实现: 导入命名空间:System.Security.Cryptography和System.Text。 C# using System.Security.Cryptography; using System.Text; 定义一个生成随机字符串的函数,函数可以包括一个参数,指定生成的字符串的长度。函数内部要创建…

    C# 2023年6月1日
    00
  • Sitecore XP 10.3(latest) Docker一键部署

    本文演示通过PowerShell+Docker Desktop for Windows 一键部署Sitecore10.3(即Sitecore最新版)Docker开发/测试/演示 环境。 官方参考 SitecoreXP 10.3.0 Developer Workstation Deployment With Docker 演示配置为XP Single(XP0)…

    C# 2023年4月27日
    00
  • C#实现矩阵加法、取负、数乘、乘法的方法

    要实现矩阵加法、取负、数乘、乘法,可以使用 C# 中的多维数组来表示矩阵,然后编写相应的函数实现这些操作。 定义矩阵 可以使用以下语句定义一个 2×3 的矩阵: int[,] matrix = new int[2,3]{{1,2,3},{4,5,6}}; 矩阵加法 矩阵加法的规则是将两个矩阵对应位置的元素相加,得到一个新的矩阵。 可以编写以下函数实现矩阵加法…

    C# 2023年6月7日
    00
  • JavaScript面向对象分层思维全面解析

    下面我将和您详细讲解“JavaScript面向对象分层思维全面解析”的完整攻略。 什么是JavaScript面向对象分层思维 JavaScript面向对象分层思维是一种针对JavaScript编程语言的面向对象设计模式。它将对象分为三个层次:业务层、数据层和界面层。每个层次都有自己独特的对象和属性。在JavaScript面向对象分层思维中,每个层次都是相互独…

    C# 2023年5月31日
    00
  • 深入分析C#异步编程详解

    深入分析C#异步编程详解攻略 什么是异步编程 异步编程是一种在执行操作时不阻塞后续操作的编程模式。在异步编程中,当一个操作被提交时,它的控制被立即返回给调用者,而不需要等待操作的完成。当操作完成后,调用者可以通过回调或轮询的方式获取操作结果。在C#中,异步编程主要通过异步方法和任务的方式实现。 异步编程的优势 异步编程有以下优势: 提高程序的资源利用率 减少…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部