C# 线程交互

一、为什么要进行线程交互

C#中,线程交互通常涉及到多个线程之间的数据共享和同步‌.

一、全局变量

C#中,全局变量是指在程序的任何地方都可以访问的变量。通常,全局变量是在类的外部定义的,或者在所有方法之外定义的。全局变量通常用于存储需要在多个方法或类之间共享的数据。

1. 在类外部定义

你可以在类定义之外定义全局变量,但这通常不推荐,因为这违背了面向对象编程的原则,即封装性。更好的做法是使用静态成员(静态变量)或单例模式来共享数据。

静态变量

静态变量属于类,而不是类的实例。这意味着你可以通过类名直接访问它,而不需要创建类的实例。

2. 使用单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

3. 在类内部作为字段使用(非静态)

如果你想在多个方法之间共享数据,但又不想让这个数据成为公共的(即不想让其他类直接访问),可以将它定义为类的字段,并通过实例方法访问。虽然这不是真正的“全局”访问,因为它需要通过类的实例访问,但它仍然可以在多个方法间共享数据。

最佳实践和建议:

封装性:尽量使用封装性原则,通过属性、方法或单例模式来控制数据的访问。

可维护性:过度使用全局变量会使代码难以维护和理解。尽量减少全局变量的使用,特别是在大型项目中。考虑使用依赖注入等设计模式来管理依赖和共享数据。

线程安全:当涉及到多线程时,确保全局变量的访问是线程安全的。可以通过lock语句或者使用Concurrent集合来处理。

二、AutoResetEvent

AutoResetEvent 是一种同步原语,它允许一个线程等待另一个线程发出信号。当一个线程调用 WaitOne() 方法时,它会被阻塞直到另一个线程调用 Set() 方法为止。每次 Set() 被调用后,AutoResetEvent 将自动重置为非信号状态,这意味着只能唤醒一个等待的线程。

三、 ManualResetEvent

AutoResetEvent 类似,ManualResetEvent 允许一个或多个线程等待某个事件的发生。不同的是,ManualResetEvent Set() 被调用之后不会自动重置,除非显式地调用了 Reset() 方法。

四、事件(Event)机制

通过事件和委托机制,可以在对象之间发送消息并通知订阅者。这种模式非常适合需要跨多个线程进行通信的情况,尤其是在图形用户界面(GUI)应用中,主线程通常用于UI更新,而子线程则处理后台任务。

五、Monitor

一、Monitor 类概述

Monitor 类位于 System.Threading 命名空间中,它允许你对对象进行锁定(即获取互斥锁),从而确保在同一时刻只有一个线程可以执行被锁定保护的代码块。

1. 基本锁机制

    Monitor.Enter Monitor.Exit 用于保护临界区,确保线程互斥访问共享资源。

    与 lock 的关系:lock 关键字是 Monitor 的语法糖,编译后等价于 try-finally 块包裹的 Enter Exit

    何时用 Monitor:需要超时控制或非阻塞尝试获取锁时(通过 TryEnter)。

2. 常用方法

    Enter:尝试进入临界区并获取锁。

    Exit:释放锁并退出临界区。

    TryEnter:尝试进入临界区并在指定时间内等待锁。

    Wait:释放当前线程持有的锁,并将该线程放入等待队列。

    Pulse/PulseAll:通知等待队列中的一个或所有线程锁已释放,它们可以重新竞争锁。

3. 使用场景

    保护共享资源:确保多个线程不会同时修改同一数据结构。

    生产者-消费者模式:协调生产者和消费者之间的操作。

    条件变量:实现基于条件的同步。

六、 InvokeBeginInvoke

Invoke BeginInvoke C#中主要用于跨线程操作UI控件,确保线程安全。‌

InvokeBeginInvoke的作用

1、线程安全问题‌:在Windows GUI编程中,UI元素只能在创建它们的线程上访问。如果在一个非UI线程中直接操作UI控件,可能会导致   异常。InvokeBeginInvoke方法用于在正确的线程上执行代码,避免这种问题。

2、同步与异步‌:

Invoke‌:同步调用,当前线程会阻塞,直到委托在目标线程(通常是UI线程)上执行完毕。适用于需要确保被调用的代码执行完成后,再继续执行后续逻辑的场景。

BeginInvoke‌:异步调用,当前线程不会阻塞,委托会立即被加入目标线程的消息队列,由目标线程异步执行。适用于不关心被调用代码的执行结果,或希望避免阻塞当前线程的场景。

B站  :道传科技上位机   观看教程视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cursor 编辑器中的 Notepad 功能使用指南

Cursor 编辑器中的 Notepad 功能使用指南 摘要 本指南全面介绍了 Cursor 编辑器中的 Notepad 功能,涵盖其用途、多种访问方式、适用场景以及与其它功能的整合技巧等内容,助力用户高效利用该功能提升工作流程效率。 不同访问方式介绍 功能概述 Curso…

用于评估大语言模型(LLMs)能力的重要基准任务(Benchmark)

基准任务涵盖了 多领域(如语言理解、数学、推理、编程、医学等)和 多能力维度(如事实检索、计算、代码生成、链式推理、多语言处理)。常用于模型发布时的对比评测,例如 GPT-4、Claude、Gemini、Mistral 等模型的论文或…

力扣HOT100之技巧:169. 多数元素

这道题如果不考虑空间复杂度和时间复杂度的限制的话很好做,一种思路是通过一次遍历将所有元素的数量记录在一个哈希表中,然后我们直接返回出现次数最多的键即可。另一种思路是直接对数组进行排序,数组中间的值一定是多数元素,因为…

wordpress首页调用指定ID页面内的相册

要在WordPress首页调用ID为2的页面中的相册,你可以使用以下几种方法: 方法一:使用短代码和自定义查询 首先,在你的主题的functions.php文件中添加以下代码: function display_page_gallery($atts) {$atts shortcod…

基于深度学习的异常检测系统:原理、实现与应用

前言 在现代数据驱动的业务环境中,异常检测(Anomaly Detection)是一个关键任务,它能够帮助企业和组织及时发现数据中的异常行为或事件,从而采取相应的措施。异常检测广泛应用于金融欺诈检测、网络安全、工业设备故障监…

Java基于BS架构的OA流程可视化实战:从工作流引擎到前端交互(附完整源代码+论文框架)

一、引言:BS架构OA系统的流程可视化需求 在企业信息化建设中,基于浏览器/服务器(BS)架构的OA系统通过流程自动化提升办公效率,而流程可视化是实现流程监控、优化的核心模块。本文基于Java技术栈,结合Activ…

JavaWeb-数据库连接池

目录 1.springboot默认Hikari(追光者)连接池 2.切换为Druid(德鲁伊)连接池 1.springboot默认Hikari(追光者)连接池 2.切换为Druid(德鲁伊)连接池 一般几乎用不到&#xff0c;不需要切换 <!--Druid连接池--> <dependency><groupId>com.alibaba</groupId&…

c# 完成恩尼格玛加密扩展

c# 完成恩尼格玛加密扩展 恩尼格玛扩展为可见字符恩尼格玛的设备原始字符顺序转子的设置反射器的设置连接板的设置 初始数据的设置第一版 C# 代码第二版 C# 代码 总结 恩尼格玛 在之前&#xff0c;我们使用 python 实现了一版恩尼格玛的加密算法&#xff0c;但是这一版&#x…

【Redisson】锁可重入原理

目录 一、基本原理 二、源码解析&#xff1a; &#xff08;2&#xff09;获取锁 &#xff08;1&#xff09;释放锁&#xff1a; 之前给大家介绍过redisson的分布式锁&#xff0c;用redisson来实现比自己手搓简单的分布式锁有很多好处&#xff0c;因为这些可重入、可重试的逻…

BERT 模型微调与传统机器学习的对比

BERT 微调与传统机器学习的区别和联系&#xff1a; 传统机器学习流程 传统机器学习处理文本分类通常包含以下步骤&#xff1a; 特征工程&#xff1a;手动设计特征&#xff08;如 TF-IDF、词袋模型&#xff09;模型训练&#xff1a;使用分类器&#xff08;如 SVM、随机森林、逻…

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…

芯科科技Tech Talks技术培训重磅回归:赋能物联网创新,共筑智能互联未来

聚焦于Matter、蓝牙、Wi-Fi、LPWAN、AI/ML五大热门无线协议与技术 为年度盛会Works With大会赋能先行 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的企业和个人开发者都非常关注最新的无线连接技术和应用…

docker-compose容器单机编排

docker-compose容器单机编排 开篇前言 随着网站架构的升级&#xff0c;容器的使用也越来越频繁&#xff0c;应用服务和容器之间的关系也越发的复杂。 这个就要求研发人员能更好的方法去管理数量较多的服务器&#xff0c;而不能手动挨个管理。 例如一个LNMP 架构&#xff0c;就…

LeetCode--29.两数相除

解题思路&#xff1a; 1.获取信息&#xff1a; 给定两个整数&#xff0c;一个除数&#xff0c;一个被除数&#xff0c;要求返回商&#xff08;商取整数&#xff09; 限制条件&#xff1a;&#xff08;1&#xff09;不能使用乘法&#xff0c;除法和取余运算 &#xff08;2&#…

中山大学GaussianFusion:首个将高斯表示引入端到端自动驾驶多传感器融合的新框架

摘要 近年来由于端到端自动驾驶极大简化了原有传统自动驾驶模块化的流程&#xff0c;吸引了来自工业界和学术界的广泛关注。然而&#xff0c;现有的端到端智驾算法通常采用单一传感器&#xff0c;使其在处理复杂多样和具有挑战性的驾驶场景中受到了限制。而多传感器融合可以很…

《哈希算法》题集

1、模板题集 满足差值的数字对 2、课内题集 字符统计 字符串统计 优质数对 3、课后题集 2006 Equations k倍区间 可结合的元素对 满足差值的数字对 异常频率 神秘数对 费里的语言 连连看 本题集为作者&#xff08;英雄哪里出来&#xff09;在抖音的独家课程《英雄C入门到精…

Cordova移动应用对云端服务器数据库的跨域访问

Cordova移动应用对云端服务器数据库的跨域访问 当基于类似 Cordova这样的跨平台开发框架进行移动应用的跨平台开发时&#xff0c;往往需要访问部署在公网云端服务器上的数据库&#xff0c;这时就涉及到了跨域数据访问的问题。 文章目录 Cordova移动应用对云端服务器数据库的跨…

mysql知识点3--创建和使用数据库

mysql知识点3–创建数据库 创建数据库 在MySQL中创建数据库使用CREATE DATABASE语句。语法如下&#xff1a; CREATE DATABASE database_name;其中database_name为自定义的数据库名称。例如创建名为test_db的数据库&#xff1a; CREATE DATABASE test_db;可以添加字符集和排…

林业资源多元监测技术守护绿水青山

在云南高黎贡山的密林中&#xff0c;无人机群正以毫米级精度扫描古树年轮&#xff1b;福建武夷山保护区&#xff0c;卫星遥感数据实时追踪着珍稀动植物的栖息地变化&#xff1b;海南热带雨林里&#xff0c;AI算法正从亿万条数据中预测下一场山火的风险……这些科幻场景&#xf…

一阶/二阶Nomoto模型(野本模型)为何“看不到”船速对回转角速度/角加速度的影响?

提问 图中的公式反映的是舵角和力矩之间的关系&#xff0c; 其中可以看到力矩&#xff08;可以理解为角加速度&#xff09;以及相应导致的回转角速度和当前的舵速&#xff08;主要由船速贡献&#xff09;有关&#xff0c;那么为什么一阶Nomoto模型&#xff08;一阶野本&#xf…