C#实现多线程的几种方式

前言
多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率。
多线程常用场景
- CPU 密集型任务.
- I/O 密集型任务.
- 并发请求处理.
- 大数据处理等.
什么是进程?
进程(Process)是计算机中的一个执行中的程序,它是对正在运行的程序的抽象。一个进程包括了程序的代码、数据、堆栈以及其他操作系统所需的资源。

什么是线程?
线程(Thread)是进程中的一个执行单元,一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的执行流程。
使用 Thread 类
public static void ThreadMethod()
{
var newThread = new Thread(WorkerMethod);
newThread.Start();
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"ThreadMethod 主线程开始工作:{i}");
Thread.Sleep(100);
}
}
private static void WorkerMethod()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}

使用 ThreadPool 类
public static void ThreadPoolMethod()
{
ThreadPool.QueueUserWorkItem(o => WorkerMethod());
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"ThreadPoolMethod 主线程开始工作:{i}");
Thread.Sleep(100);
}
}
private static void WorkerMethod()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}

使用 Task 类
public static void TaskMethod()
{
Task.Run(() => WorkerMethod());
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"TaskMethod 主线程开始工作:{i}");
Task.Delay(100).Wait();
}
}
private static void WorkerMethod()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}

使用 Parallel 类
public static void ParallelMethod()
{
Parallel.Invoke(WorkerMethod, WorkerMethodOther1, WorkerMethodOther2);
}
private static void WorkerMethod()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}
private static void WorkerMethodOther1()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethodOther1 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}
private static void WorkerMethodOther2()
{
for (int i = 0; i < 8; i++)
{
Console.WriteLine($"WorkerMethodOther2 辅助线程开始工作:{i}");
Thread.Sleep(100);
}
}

拾遗补漏合集
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
GitHub开源地址
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetStudy.md
拾遗补漏知识点投稿
该Issues主要是给各位小伙伴们提供投稿的地方,你有什么想要学习的C#/.NET/.NET Core相关技术栈或者已学习过且有文章输出的欢迎在投稿!
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
- 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。
C#实现多线程的几种方式的更多相关文章
- c#使用多线程的几种方式示例详解
本文转载自:http://www.jb51.net/article/46234.htm 本文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧 (1)不需要传递参数 ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
- java多线程系类:基础篇:02常用的实现多线程的两种方式
本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多 ...
- Java实现多线程的两种方式
实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...
- c# 多线程的几种方式
1.什么是线程? 进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源. 2.前台线程和后台线程的区别? 程序关闭时,后台线程直接关闭,但前台线程 ...
- 创建多线程的第一种方式——创建Thread子类和重写run方法
创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...
- Java实现多线程的三种方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.前两种方式启动的线程没有返回值 ...
- Java中实现多线程的四种方式
Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...
- Java中实现多线程的两种方式之间的区别
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- JAVA实现多线程的四种方式
JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...
随机推荐
- SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式.通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个.一个或多个字符. 下划线 _ 代表一个单个字符. 以下是LIKE运 ...
- Bash与shell的区别
Bash 与 shell 的区别 介绍 常见的 shell 解释器有 sh.bash 这两种,其他的 ksh.csh 和 zsh 等是不常见的.Mac OS 中默认安装了以上所有类型,Windows ...
- Windows Server 2012 安装WireShark
一.环境说明 Windows Server 2012 R2 版本64位: 安装wireshark 二.问题描述 安装wireshark提示 The Visual C++ Redistributable ...
- c# 如何在一般处理程序中返回json
前言 迁移以前的笔记. 正文 无论是一般处理程序,还是其他程序,处理事项,肯定在于HttpResponse. 这种情况就可以操作,至于字符是自己转换还是由HttpResponse中的信息默认转换,都没 ...
- 重走py 之路 ——字典和集合(二)
前言 python 中有6大标准类型: 数字(Number) 字符串(String) 列表(List) 元组(Tumple) 集合(Set) 字典(Dictionary) 前面已经介绍了上面4种,还有 ...
- Web自动化实战:去哪儿网购票流程测试
克隆源码 项目Github地址:https://github.com/gy-7/Web-automation-practice/tree/main/project1_qunar_booking_tic ...
- kubelet 原理分析
Reference https://atbug.com/kubelet-source-code-analysis/ kubelet 简介 kubernetes 分为控制面和数据面,kubelet 就是 ...
- 剑指offer004(Java)-只出现一次的数字(中等)
题目: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回那个只出现了一次的元素. 示例1: 输入:nums = [2,2,3,2] 输出:3 示例 ...
- 力扣287(java&python)-寻找重复数(中等)
题目: 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数. 假设 nums 只有 一个重复的整数 ,返回 这个重复的 ...
- MongoDB 5.0新特性概览
简介: MongoDB 5.0标志着一个新的发布周期的到来,以更快地交付新特性给到用户.版本化API与在线重新分片相结合,使用户不必担心未来的数据库升级以及业务变化问题:本地原生时间序列数据平台也使 ...