当前位置: 首页 > news >正文

C# Thread的使用

在C#中,线程用于实现程序的并发执行。通过创建和管理多个线程,可以同时处理不同的任务或操作,从而提高程序性能和响应性。以下是如何在C#中使用线程的基本步骤:

创建新线程

// 使用System.Threading命名空间
using System.Threading;public class ThreadExample
{// 定义一个将在线程上运行的方法static void ThreadMethod(){Console.WriteLine("线程正在执行...");// 这里是线程需要执行的任务代码}public static void Main(){// 创建新的线程对象Thread newThread = new Thread(new ThreadStart(ThreadMethod));// 设置线程优先级(可选)newThread.Priority = ThreadPriority.Normal;// 启动线程newThread.Start();// 主线程继续执行...Console.WriteLine("主线程仍在执行...");// 如果需要等待子线程完成(同步),可以使用Join方法newThread.Join();}
}

使用Lambda表达式创建线程

从C# 2.0开始,可以通过匿名委托或者lambda表达式简化线程创建过程:

new Thread(() =>
{Console.WriteLine("使用lambda表达式的线程正在执行...");
}).Start();

线程间通信和共享数据

  • 参数传递:若要传递参数给线程函数,可以定义一个自定义委托类型,并使用ParameterizedThreadStart
delegate void ParameterizedThreadStart(object obj);static void ThreadMethodWithParam(object data)
{int value = (int)data;Console.WriteLine($"线程接收到的参数值: {value}");
}// 创建并启动带参数的线程
Thread threadWithParam = new Thread(new ParameterizedThreadStart(ThreadMethodWithParam));
threadWithParam.Start(42);
  • 共享数据:对于多线程环境中的共享数据,通常需要使用锁或其他同步机制来确保线程安全,如lock关键字、Monitor类、MutexSemaphore,或是.NET Framework 4.0引入的Concurrent集合等。

  • 线程安全返回值:获取线程返回值的方式通常是通过使用Task<T>类(从.NET 4.0开始)、async/await异步编程模型,或者使用共享变量配合锁定机制。

注意事项

  • .NET Framework 2.0及更早版本中提供了Thread.SuspendThread.Resume方法用于挂起和恢复线程,但这些方法已被弃用,因为它们可能导致死锁和其他难以调试的问题。在现代编程中,应尽量避免直接挂起线程,而是使用更高级别的同步原语。

  • 在创建大量线程时,要考虑系统的资源限制以及上下文切换开销。

  • 对于长时间运行的后台任务,推荐使用ThreadPool或Task Parallel Library (TPL),它们能更有效地管理和复用线程资源。例如:

// 使用ThreadPool
ThreadPool.QueueUserWorkItem(state => 
{Console.WriteLine("ThreadPool线程正在执行...");
});// 使用TPL(C# 4.0及以上)
Task.Run(() =>
{Console.WriteLine("使用Task.Run创建的线程正在执行...");
});
  • 自C# 5.0开始,随着异步编程模型的改进,许多I/O密集型任务更适合使用异步方法而非创建额外的线程。

 

请注意,创建过多的线程可能会导致性能问题,因为线程的创建和销毁都需要资源。因此,在设计多线程应用程序时,应该仔细考虑线程的数量和任务分配。

此外,对于涉及共享资源的多线程程序,需要注意线程同步和锁的使用,以避免竞态条件和死锁等问题。

多线程编程涉及到并发和线程安全等复杂的概念。在实际使用中,需要谨慎处理线程间的共享资源和并发操作,以避免出现竞态条件和其他并发问题。

 

如果需要使用线程分离,请参考:

wpf 两个Window其中一个是主线程,怎么才能不影响他们的独立性,操作互不影响?-CSDN博客

 

C# 中的ApartmentState的几种状态的意义及使用

ApartmentState是.NET框架中与线程模型相关的枚举类型,它用于描述托管线程的执行上下文环境(即COM中的单元 apartment)。

在多线程编程和COM(Component Object Model)交互时,线程的Apartment状态尤为重要,因为COM对象可能要求特定的线程模型来保证其正确工作。

ApartmentState有以下几种状态:

  1. STA (Single-Threaded Apartment)

    • 单线程单元:在这种模式下,一个线程在同一时间内只能处理一个COM对象的调用。这是Windows UI线程(例如WinForms、WPF等应用程序主线程)通常所采用的模型,也是支持基于界面或消息队列的COM组件所必需的环境。某些COM对象如Internet Explorer浏览器控件需要运行在STA线程上才能正常工作。
  2. MTA (Multi-Threaded Apartment)

    • 多线程单元:在MTA模式下,线程可以同时服务于多个COM对象,并且任何线程都可以访问MTA线程上的COM对象。这意味着同一时间可能会有多个线程并发地对这些对象进行调用,因此MTA线程下的对象必须设计为线程安全的。
  3. Unknown

    • 未知:初始状态下新创建的线程尚未确定其Apartment状态,对于非COM交互的普通托管线程,这个状态并不重要。当线程被启动并分配到线程池时,其实际状态将由运行时决定。

在使用时,可以根据应用需求和COM组件的要求来设置线程的Apartment状态。

例如,如果应用程序需要在一个单独的线程上创建和操作COM组件,而该组件要求STA环境,则你需要显式地创建一个 STA 状态的线程。

若不涉及COM交互,则Apartment状态一般无需特别关注。

 

 

相关文章:

C# Thread的使用

在C#中&#xff0c;线程用于实现程序的并发执行。通过创建和管理多个线程&#xff0c;可以同时处理不同的任务或操作&#xff0c;从而提高程序性能和响应性。以下是如何在C#中使用线程的基本步骤&#xff1a; 创建新线程 // 使用System.Threading命名空间 using System.Threa…...

ETL数据集成工具DataX、Kettle、ETLCloud特点对比

ETL数据集成工具 对于数据仓库&#xff0c;大数据集成类应用&#xff0c;通常会采用ETL工具辅助完成。ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取(extract) 、交互转换(transform) 、加载(load)至的端的过程当前的很多应…...

OpenAI:Sora视频生成模型技术报告(中文)

概述 视频生成模型作为世界模拟器 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用transformer架构&#xff0c;在视频和图像潜在代码的时空补丁上运行。我们最大的模型Sor…...

Java基于微信小程序的乐室预约小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

Linux常见指令(一)

目录 一、基本指令 1.1ls指令 1.2pwd指令 1.3cd指令 1.4touch指令 1.5mkdir指令 1.6rmdir指令、rm指令 1.7man指令 1.8cp指令 1.9mv指令 1.10cat 一、基本指令 1.1ls指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 功能&#xff1a;对于目录&#xff0c;该命令…...

大端和小端传输字节完整版

大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…...

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…...

ES实战--性能提升

触发冲刷的条件: 1.内存缓冲区已满 2.自上次冲刷后超过了一定时间 3.事务日志达到了一定阀值 对名为get-together的Elasticsearch索引执行优化操作&#xff0c;将索引中的数据段&#xff08;segments&#xff09;合并到指定的数量1 GET /get-together/_optimize?max_num_segm…...

解决ModuleNotFoundError: No module named ‘pysqlite2‘

目录 一、问题描述&#xff1a; 二、问题分析&#xff1a; 三、问题解决&#xff1a; 四、参考文章&#xff1a; 一、问题描述&#xff1a; 在重新安装的anaconda环境中自建了一个新虚拟环境&#xff0c;再安装完jupyter后&#xff08;pip install jupyter&#xff09;&am…...

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…...

React 的调度系统 Scheduler

原文地址1 原文地址2 其中startTime是任务开始的时间&#xff0c;默认是-1&#xff0c;任务开始时将任务开始时间赋值给了startTime&#xff0c; 这里意思是判断这个任务执行时间是否超过5ms(写死的)。若超过&#xff0c;则要交出。...

微服务OAuth 2.1认证授权Demo方案(Spring Security 6)

文章目录 一、介绍二、auth微服务代码1. SecurityConfig2. UserDetailsService3. 总结 三、gateway微服务代码1. 统一处理CORS问题 四、content微服务代码1. controller2. SecurityConfig3. 解析JWT Utils4. 总结 五、一些坑 书接上文 微服务OAuth 2.1认证授权可行性方案(Sprin…...

WSL使用Centos7发行版(rootfs)

参考 导入要与 WSL 一起使用的任何 Linux 发行版 microsoftWSL2 的 2.0 更新彻底解决网络问题install daemon and client binaries on linuxInstall Compose standalone WSL配置 在HOST中&#xff0c;编辑用户目录下的.wslconfig文件 我需要使用docker&#xff0c;测试发现a…...

ClickHouse--04--数据库引擎、Log 系列表引擎、 Special 系列表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.数据库引擎1.1 Ordinary 默认数据库引擎1.2 MySQL 数据库引擎MySQL 引擎语法字段类型的映射 2.ClickHouse 表引擎3.Log 系列表引擎几种 Log 表引擎的共性是&#…...

docker的底层原理

概述&#xff1a;Docker的底层原理基于容器化技术&#xff0c;通过使用命名空间和控制组等技术实现资源的隔离与管理。 底层原理&#xff1a; 客户端-服务器架构&#xff1a;Docker采用的是Client-Server架构&#xff0c;其中Docker守护进程&#xff08;daemon&#xff09;运…...

有关光猫、路由器、交换机、网关的理解

前提 在了解计算机网络的过程中&#xff0c;出现了这四个名词&#xff1a;光猫、路由器、交换机、网络。有点模糊&#xff0c;查阅互联网相关资料&#xff0c;进行整理。如有错误&#xff0c;欢迎大家批评指正。 光猫 首先光猫是物理存在的&#xff0c;大家在家里应该都可以…...

图像旋转翻转变换

题目描述 给定m行n列的图像各像素点灰度值&#xff0c;对其依次进行一系列操作后&#xff0c;求最终图像。 其中&#xff0c;可能的操作及对应字符有如下四种&#xff1a; A&#xff1a;顺时针旋转90度&#xff1b; B&#xff1a;逆时针旋转90度&#xff1b; C&#xff1a…...

网站常见的反爬手段及反反爬思路

摘要:介绍常见的反爬手段和反反爬思路&#xff0c;内容详细具体&#xff0c;明晰解释每一步&#xff0c;非常适合小白和初学者学习&#xff01;&#xff01;&#xff01; 目录 一、明确几个概念 二、常见的反爬手段及反反爬思路 1、检测user-agent 2、ip 访问频率的限制 …...

GUI—— 从的可执行exe文件中提取jar包并反编译成Java

从exe4j生成的可执行文件中提取嵌入的jar包并反编译成Java代码&#xff0c;可以按照以下步骤操作&#xff1a; 步骤1&#xff1a;提取jar包 1.运行exe程序&#xff1a;首先启动exe4j生成的.exe可执行文件。当它运行时&#xff0c;通常会将内部包含的jar文件解压到临时目录下。…...

阿里云服务器镜像是什么?如何选择镜像?

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...