百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

解析C#中的多线程编程机制:Thread、ThreadPool、Task和Parallel

wptr33 2025-04-29 05:35 3 浏览

Thread、ThreadPool、Task和Parallel是C#中用于多线程编程和并行处理的不同机制。每个机制都有自己的原理和使用方式。可以根据需求选择适当的机制来实现并发性和并行性,并结合示例进行深入理解和应用。

Thread

Thread是C#中最基本的多线程编程机制。它基于操作系统的线程机制,用于创建和管理线程的生命周期。每个Thread实例代表一个独立的执行线程。

原理: 当创建一个Thread实例时,操作系统为该线程分配一段独立的内存空间,包括线程上下文、栈、寄存器等。操作系统的调度器负责将线程从待执行状态切换到运行状态,并分配给它执行的时间片。开发者可以通过Thread类的方法来控制线程的启动、暂停、终止等操作。

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread thread = new Thread(DoWork);
        thread.Start(); // 启动新线程执行DoWork方法
        Console.WriteLine("Main thread");

        // 阻塞主线程等待子线程执行完毕
        thread.Join();

        Console.WriteLine("Main thread exiting");
    }

    static void DoWork()
    {
        Console.WriteLine("Worker thread");
    }
}

在示例中,通过创建Thread实例并传入要执行的方法(DoWork),创建了一个新的线程。通过调用Start方法启动线程,它会在后台执行DoWork方法。同时,主线程继续执行,并输出"Main thread"。使用Join方法阻塞主线程,直到子线程执行完毕后输出"Main thread exiting"。最后,子线程执行DoWork方法并输出"Worker thread"。

ThreadPool

ThreadPool是C#中的线程池,它提供了一组预先创建的线程,用于执行多个短期任务。ThreadPool自动管理线程的创建、调度和销毁,通过将任务提交给线程池来执行。

原理: ThreadPool会维护一定数量的线程,这些线程在空闲时处于等待状态,当有任务需要执行时,线程池会自动分配一个空闲线程来执行任务。执行完任务后,线程会返回线程池,可以被其他任务复用,从而避免了频繁创建和销毁线程的开销。

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            ThreadPool.QueueUserWorkItem(DoWork, i); // 提交任务到线程池
        }

        Console.WriteLine("Main thread");

        // 等待所有任务执行完毕
        Thread.Sleep(2000);

        Console.WriteLine("Main thread exiting");
    }

    static void DoWork(object state)
    {
        int index = (int)state;
        Console.WriteLine(#34;Worker thread {index}");
    }
}

在示例中,通过循环向线程池提交5个任务,使用
ThreadPool.QueueUserWorkItem方法将DoWork方法作为委托传递给线程池。主线程继续执行并输出"Main thread",然后等待一段时间(这里使用Thread.Sleep)以确保所有任务执行完毕。最后,输出"Main thread exiting"。每个任务在工作线程中执行,并输出相应的"Worker thread"信息。

Task

Task是.NET Framework中用于实现并行编程的高级抽象,用于表示异步操作和任务。Task提供了一种更简单、更灵活的方式来进行多线程编程。

原理: Task基于线程池,并利用任务调度器自动分配和管理线程资源。Task可以表示一个异步操作,也可以表示一个可以返回结果的任务。通过Task.Factory.StartNew或Task.Run方法,可以创建并执行任务,并通过Task.ContinueWith等方法定义任务之间的关系。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        Task<int> task = Task.Run(() => CalculateSum(10));
        Console.WriteLine("Main thread");

        // 等待任务完成并获取结果
        int result = task.Result;

        Console.WriteLine(#34;Sum: {result}");
        Console.WriteLine("Main thread exiting");
    }

    static int CalculateSum(int n)
    {
        int sum = 0;
        for (int i = 1; i <= n; i++)
        {
            sum += i;
        }
        return sum;
    }
}

在示例中,通过Task.Run方法创建一个任务,该任务调用CalculateSum方法来计算从1到10的和。主线程继续执行并输出"Main thread",然后等待任务完成并获取结果(使用task.Result)。最后,输出计算结果并输出"Main thread exiting"。

Parallel

Parallel是一个并行编程库,提供了一种简化并行处理的方式,如并行循环、迭代和任务。

原理: Parallel通过自动化任务的拆分和分配,利用多个线程并行执行任务,以提高处理大量数据和计算密集型任务的效率。Parallel使用并行循环(Parallel.For、Parallel.ForEach)、并行迭代(Parallel.Invoke)和任务并行(Parallel.Invoke、Parallel.For、Parallel.ForEach)等方法来实现并行处理。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        Parallel.For(0, 10, i =>
        {
            Console.WriteLine(#34;Worker thread {i}");
        });

        Console.WriteLine("Main thread exiting");
    }
}

在示例中,使用Parallel.For方法实现并行循环,对一个范围内的整数执行并行操作。这里并行处理10个任务,每个任务输出对应的"Worker thread"信息。主线程不阻塞,并输出"Main thread exiting"。

相关推荐

VPS主机搭建Ghost环境:Nginx Node.js MariaDB

Ghost是一款个人博客系统,它是使用Node.js语言和MySQL数据库开发的,同时支持MySQL、MariaDB、SQLite和PostgreSQL。用户可以在支持Node.js的服务器上使用自己...

centos7飞速搭建zabbix5.0并添加windows、linux监控

一、环境zabbix所在服务器系统为centos7,监控的服务器为windows2016和centos7。二、安装zabbix官方安装帮助页面...

Zabbix5.0安装部署

全盘展示运行状态,减轻运维人员的重复性工作量,提高系统排错速度,加速运维知识学习积累。1.png...

MariaDB10在CentOS7系统下,迁移数据存储位置

背景在CentOS7下如果没有默认安装MySQL数据库,可以选择安装MariaDB,最新的版本现在是10可以选择直接yum默认安装的方式yum-yinstallmariadbyum-yi...

frappe项目安装过程

1,准备一台虚拟机,debian12或者ubuntusever22.04.3可以用virtualbox/qemu,或者你的超融合服务器安装一些常用工具和依赖库我这里选择server模式安装,用tab...

最新zabbix一键安装脚本(基于centos8)

一、环境准备注意:操作系统必须是centos8及以上的,因为我配的安装源是centos8的。并且必须连接互联网,脚本是基于yum安装的!!!...

ip地址管理之phpIPAM保姆级安装教程 (原创)

本教程基于Ubuntu24.04LTS,安装phpIPAM(最新稳定版1.7),使用Apache、PHP8.3和MariaDB,遵循最佳实践,确保安全性和稳定性。一、环境准备1....

centos7傻瓜式安装搭建zabbix5.0监控服务器教程

zabbix([`zaebiks])是一个基于WEB界面的提供分布式系统监视...

zabbix7.0LTS 保姆级安装教程 小白也能轻松上手安装

系统环境:rockylinux9.4(yumupdate升级到最新版本)数据库:mariadb10.5.22第一步:关闭防火墙和selinux使用脚本关闭...

ubuntu通过下载安装包安装mariadb10.4

要在Ubuntu18.04上安装MariaDB10.4.34,用的是那个tar.gz的安装包。步骤大概是:...

从0到1:基于 Linux 快速搭建高可用 MariaDB Galera 集群(实战指南)

在企业生产环境中,数据库的高可用性至关重要。今天带你从0到1,手把手在Linux系统上快速搭建一个高可用MariaDBGaleraCluster,实现数据库同步复制、故障自动恢复,保障业务...

Windows 中安装 MariaDB 数据库

mariadb在Windows下的安装非常简单,下载程序双击运行就可以了。需要注意:mariadb和MySQL数据库在Windows下默认是不区分大小写的,但是在Linux下是区分...

SQL执行顺序(SqlServer)

学习SQL这么久,如果突然有人问你SQL的执行顺是怎么样的?是不是很多人会觉得C#、JavaScript都是根据编程顺序来处理的,那么SQL也是根据编程顺序来执行的吗?...

C# - StreamWriter与StreamReader 读写文件 101

读写文本文件的方式:1)File静态类的File.ReadAllLines();与File.WriteAllLines();方法进行读写...

C#中的数组探究与学习

C#中的数组一般分为:...