C# 多线程并发编程基础
1. 线程基础
1.1 线程简介
C# 中的线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行不同的任务。
1.2 线程的创建与启动
在 C# 中,可以使用 System.Threading.Thread 类来创建和管理线程。
创建线程:
Thread thread = new Thread(new ThreadStart(YourMethod));
启动线程:
thread.Start();
1.3 线程的状态
线程在其生命周期中会经历多种状态,包括新建、就绪、运行、阻塞和死亡等。
1.4 线程的优先级
C# 中的线程具有优先级,可以通过 Thread.Priority 属性来设置。优先级高的线程更有可能获得 CPU 时间片。
2. 多线程编程基础
2.1 线程同步
多线程编程中,由于多个线程可能同时访问共享资源,因此需要考虑同步问题。C# 提供了多种同步机制。
锁(Lock):
object lockObject = new object();
lock (lockObject)
{// 临界区代码
}
互斥量(Mutex):
Mutex mutex = new Mutex();
mutex.WaitOne();
// 临界区代码
mutex.ReleaseMutex();
信号量(Semaphore):
Semaphore semaphore = new Semaphore(1, 1);
semaphore.WaitOne();
// 临界区代码
semaphore.Release();
2.2 线程间通信
线程间通信是多线程编程中的重要部分,C# 提供了多种机制来实现线程间的通信。
事件(Event):
ManualResetEvent event = new ManualResetEvent(false);
event.Set(); // 通知其他线程
event.WaitOne(); // 等待其他线程通知
等待句柄(WaitHandle):
AutoResetEvent waitHandle = new AutoResetEvent(false);
waitHandle.Set(); // 通知其他线程
waitHandle.WaitOne(); // 等待其他线程通知
2.3 线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在后台以异步方式执行任务。
使用线程池:
ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod));
2.4 异步编程
C# 提供了异步编程模型(Async/Await),可以简化异步操作的编写。
异步方法:
public async Task<int> YourAsyncMethod()
{// 异步操作var result = await SomeAsyncOperation();return result;
}
3. 高级线程管理
3.1 并行类库(TPL)
.NET Framework 4 引入了任务并行库(Task Parallel Library, TPL),用于简化并行编程。
创建任务:
Task task = new Task(YourMethod);
task.Start();
等待任务完成:
Task.WaitAll(task1, task2);
并行循环:
Parallel.For(0, 100, i =>
{// 并行执行的代码
});
3.2 并行 LINQ(PLINQ)
PLINQ 是对 LINQ to Objects 的并行实现,可以显著提高数据处理的性能。
PLINQ 查询:
var query = from num in numbers.AsParallel()where num % 2 == 0select num;
3.3 同步上下文(SynchronizationContext)
同步上下文用于确保在正确的线程上执行回调。
获取当前同步上下文:
SynchronizationContext context = SynchronizationContext.Current;
发布到同步上下文:
context.Post(state =>
{// 在正确的线程上执行的代码
}, state);
4. 线程安全集合
4.1 线程安全集合类
C# 提供了一些线程安全的集合类,可以在多线程环境下安全地使用。
线程安全字典(ConcurrentDictionary):
ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>();
dict.TryAdd(1, "Value1");
string value;
dict.TryGetValue(1, out value);
线程安全队列(ConcurrentQueue):
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
int item;
queue.TryDequeue(out item);
4.2 不可变集合
不可变集合是一旦创建就不能修改的集合,可以安全地在多线程间共享。
创建不可变集合:
ImmutableList<int> list = ImmutableList.Create(1, 2, 3);
5. 性能监控与调试
5.1 性能监控
使用性能监控工具可以帮助诊断多线程程序中的性能瓶颈。
性能计数器:
PerformanceCounter counter = new PerformanceCounter("Category", "Counter");
counter.NextValue();
5.2 调试技巧
调试多线程程序需要特殊的技巧和工具。
使用 Visual Studio 调试器:
- 断点
- 并行堆栈窗口
- 并行任务窗口
日志记录:
using (var writer = new StreamWriter("log.txt", true))
{writer.WriteLine("Thread {0} is executing.", Thread.CurrentThread.ManagedThreadId);
}
6. 最佳实践与常见问题
6.1 最佳实践
- 尽量使用线程池来管理线程
- 避免过度同步
- 使用异步编程模型来提高响应性和性能
6.2 常见问题
- 死锁
- 竞态条件
- 线程饥饿
通过遵循最佳实践和了解常见问题,可以编写出高效、稳定的多线程程序。
以上是 C# 多线程并发编程的基础内容,通过掌握这些基本概念和技巧,可以开始编写高效的多线程应用程序。
相关文章:
C# 多线程并发编程基础
1. 线程基础 1.1 线程简介 C# 中的线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行不同的任务。 1.2 线程的创建与启动 在 C# 中,可以使…...
RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)
在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...
QML和C++交互
目录 1 QML与C交互基础1.1 全局属性1.2 属性私有化(提供接口访问) 2 QT与C交互(C创建自定义对象,qml文件直接访问)3 QT与C交互(qml直接访问C中的函数)4 QT与C交互(qml端发送信号 C端实现槽函数)…...
Android studio学习之路(六)--真机的调试以及多媒体照相的使用
多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机…...
解决 Lettuce 在 Redis 集群模式下的故障转移问题
引言 在高可用系统中,故障转移是确保服务不中断的重要机制。当我们使用 Lettuce 作为 Redis 的 Java 客户端时,如何高效地处理故障转移成为一项关键任务。本篇文章将探讨如何在 Redis 集群模式下配置 Lettuce 以优化故障转移。 背景 在初期设置 Lettu…...
Qt 资源文件(.qrc 文件)
Qt 资源文件(.qrc 文件)是 Qt 提供的一种机制,用来将文件(如图像、音频、文本文件等)嵌入到应用程序中,使得这些文件不需要依赖外部文件路径,而是直接打包到程序的可执行文件中。通过使用 Qt 资…...
Vue 组件命名及子组件接收参数命名
1. 对于单个单词的组件 方式一:首字母大写。如 <School></School>。在 vue 开发者工具中默认使用的是该种方式。 方式二: 首字母小写。如 <school></school> 2. 对于多个单词的组件 方式一:每个单词都是小写&…...
PandaAI:一个基于AI的对话式数据分析工具
PandaAI 是一个基于 Python 开发的自然语言处理和数据分析工具,支持问答式(ChatGPT)的数据分析和报告生成功能。PandaAI 提供了一个开源的框架,主要核心组件包含用于数据处理的数据准备层(Pandas)以及实现 …...
【C++算法】50.分治_归并_翻转对
文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 493. 翻转对 题目描述: 解法 分治 策略一:计算当前元素cur1后面,有多少元素的两倍比我cur1小(降序) 利用单…...
Github最新AI工具汇总2025年4月份第2周
根据GitHub官方动态及开发者生态最新进展,以下是2025年4月第二周(截至4月7日)值得关注的AI工具与技术更新汇总: 1. GitHub Copilot Agent Mode全量发布 核心功能:在VS Code中启用Agent模式后,Copilot可自主…...
用VAE作为标题显示标题过短,所以标题变成了这样
VAE (Variational Autoencoder / 变分自编码器) 基本概念: VAE 是一种生成模型 (Generative Model),属于自编码器 (Autoencoder) 家族。 它的目标是学习数据的潜在表示 (Latent Representation),并利用这个表示来生成新的、与原始数据相似的数据。 与标…...
docker的run命令 笔记250406
docker的run命令 笔记250406 Docker 的 run 命令用于创建并启动一个新的容器。它是 Docker 中最常用的命令之一,基本语法为: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用选项(OPTIONS) 参数说明-d 或 --detach后台运行…...
基于pycatia的CATIA层级式BOM生成器开发全解析
引言:BOM生成技术的革新之路 在高端装备制造领域,CATIA的BOM管理直接影响着研发效率和成本控制。传统VBA方案 虽能实现基础功能,但存在代码维护困难、跨版本兼容性差等痛点。本文基于pycatia框架,提出一种支持动态层级识别、智能查重、Excel联动的BOM生成方案,其核心突破…...
Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南
Flink Kafka Connector 新旧 API 深度解析与迁移指南 一、Flink Kafka Connector 演进背景 Apache Flink 作为实时计算领域的标杆框架,其 Kafka 连接器的迭代始终围绕性能优化、语义增强和API 统一展开。Flink 1.20 版本将彻底弃用基于 FlinkKafkaConsumer/FlinkK…...
2025年渗透测试面试题总结- 某四字大厂面试复盘扩展 一面(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某四字大厂面试复盘扩展 一面 一、Java内存马原理与查杀 二、冰蝎与哥斯拉原理对比(技术演…...
批量压缩 jpg/png 等格式照片|批量调整图片的宽高尺寸
图片格式种类非常的多,并且不同的图片由于像素、尺寸不一样,可能占用的空间也会不一样。文件太大会占用较多的磁盘空间,传输及上传系统都非常不方便,可能会收到限制,因此我们经常会碰到需要对图片进行压缩的需求。如何…...
目录穿越 + pickle反序列化 -- xyctf Signin WP
源代码 # -*- encoding: utf-8 -*-File : main.py Time : 2025/03/28 22:20:49 Author : LamentXUflag in /flag_{uuid4}from bottle import Bottle, request, response, redirect, static_file, run, route secret aapp Bottle() route(/) def index():return…...
Spring Boot 框架注解:@ConfigurationProperties
ConfigurationProperties(prefix "sky.jwt") 是 Spring Boot 框架里的一个注解,其主要功能是把配置文件(像 application.properties 或者 application.yml)里的属性值绑定到一个 Java 类的字段上。下面详细阐述其作用:…...
【动手学深度学习】卷积神经网络(CNN)入门
【动手学深度学习】卷积神经网络(CNN)入门 1,卷积神经网络简介2,卷积层2.1,互相关运算原理2.2,互相关运算实现2.3,实现卷积层 3,卷积层的简单应用:边缘检测3.1࿰…...
在huggingface上制作小demo
在huggingface上制作小demo 今天好兄弟让我帮他搞一个模型,他有小样本的化学数据,想让我根据这些数据训练一个小模型,他想用这个模型预测一些值 最终我简单训练了一个小模型,起初想把这个模型和GUI界面打包成exe发给他࿰…...
集合学习内容总结
集合简介 1、Scala 的集合有三大类:序列 Seq、集Set、映射 Map,所有的集合都扩展自 Iterable 特质。 2、对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包 不可变集合:scala.collect…...
51.评论日记
千万不能再挖了,否则整个华夏文明将被改写。_哔哩哔哩_bilibili 2025年4月7日22:13:42...
SpringCloud第二篇:注册中心Eureka
注册中心的意义 注册中心 管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。 有了注册中心,调用关系的变化,画几个简图来看一下。(了解源码可求求: 1791743380) 服务A调用服务B 有了注册中心之后&a…...
ES 参数调优
1、refresh_interval 控制索引刷新的时间间隔。增大这个值可以减少I/O操作,从而提升写入性能,但会延迟新文档的可见性 查看 GET /content_erp_nlp_help_202503191453/_settings?include_defaultstrue 动态修改:refresh_interval 是一个动态…...
用claude3.7,不到1天写了一个工具小程序(11个工具6个游戏)
一、功能概览和本文核心 本次开发,不是1天干撸,而是在下班后或早起搞的,总体加和计算了一下,大概1天的时间(12个小时),平常下班都是9点的衰仔,好在还有双休,谢天谢地。 …...
【GeoDa使用】空间自相关分析操作
使用 GeoDa 软件进行空间自相关分析 双击打开 GeoDa 软件 选择 .shp 文件 导入文件 空间权重矩阵(*.gal / *.gwt)是进行任何空间分析的前提 构建空间权重矩阵 空间权重矩阵(Spatial Weights Matrix) 是一个用来描述空间对象之间…...
什么是数据
一、数据的本质定义 哲学视角 亚里士多德《形而上学》中"未加工的观察记录"现代认知科学:人类感知系统接收的原始刺激信号(如视网膜光信号、听觉神经电信号)信息论奠基人香农:消除不确定性的度量载体 …...
C++基于rapidjson的Json与结构体互相转换
简介 使用rapidjson库进行封装,实现了使用C对结构体数据和json字符串进行互相转换的功能。最短只需要使用两行代码即可无痛完成结构体数据转换为Json字符串。 支持std::string、数组、POD数据(int,float,double等)、std::vector、嵌套结构体…...
OpenStack Yoga版安装笔记(十七)安全组笔记
一、安全组与iptables的关系 OpenStack的安全组(Security Group)默认是通过Linux的iptables实现的。以下是其主要实现原理和机制: 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…...
通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元
通义万相2.1图生视频大模型 通义万相2.1图生视频技术架构万相2.1的功能特点性能优势与其他工具的集成方案 蓝耘平台部署万相2.1核心目标典型应用场景未来发展方向 通义万相2.1ALGC实战应用操作说明功能测试 为什么选择蓝耘智算蓝耘智算平台的优势如何通过API调用万相2.1 写在最…...
