C# 消息队列、多线程、回滚、并行编程、异步编程、反射
消息队列
消息队列是一种在应用程序之间传递消息的异步通信机制。它可以使应用程序解耦并提高系统的可伸缩性和可靠性。在 C# 中,你可以使用多个消息队列技术,其中一种广泛使用的技术是 RabbitMQ。
RabbitMQ 是一个开源的消息代理,实现了高级消息队列协议(AMQP),提供了强大的功能来处理消息传递。以下是一个使用 RabbitMQ 的 C# 示例:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;// 创建连接和通道
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{// 声明队列channel.QueueDeclare(queue: "hello",durable: false,exclusive: false,autoDelete: false,arguments: null);// 发布消息var message = "Hello, RabbitMQ!";var body = Encoding.UTF8.GetBytes(message);channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: null,body: body);Console.WriteLine(" [x] Sent {0}", message);
}
以上示例演示了如何创建一个 RabbitMQ 连接,声明队列,并发布一条消息到该队列。
多线程
多线程允许在同一时间执行多个独立的任务,以提高程序的效率和响应性。在 C# 中,你可以使用 System.Threading.Thread 命名空间来处理多线程编程。以下是一个简单的多线程示例:
using System;
using System.Threading;public class Program
{public static void Main(){// 创建并启动新线程Thread newThread = new Thread(WorkerMethod);newThread.Start();// 在主线程中执行其他任务for (int i = 0; i < 5; i++){Console.WriteLine("Main thread executing...");Thread.Sleep(1000);}// 等待新线程结束newThread.Join();Console.WriteLine("Main thread finished.");}public static void WorkerMethod(){for (int i = 0; i < 5; i++){Console.WriteLine("Worker thread executing...");Thread.Sleep(2000);}}
}
以上示例创建了一个新线程并在后台执行 WorkerMethod 方法。同时,主线程也在执行自己的任务。两个线程交替输出消息,直到达到各自执行次数的上限。
多线程处理逻辑
在多线程编程中,处理逻辑涉及管理线程之间的同步、协作和临界区等问题。C# 提供了几种机制来处理这些问题,如锁 (lock)、互斥体 (Mutex) 和信号量 (Semaphore)。以下是一个使用 lock 实现同步访问共享资源的示例:
using System;
using System.Threading;public class Program
{private static object lockObj = new object();private static int counter = 0;public static void Main(){Thread thread1 = new Thread(IncrementCounter);Thread thread2 = new Thread(IncrementCounter);thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine("Final counter value: " + counter);}public static void IncrementCounter(){for (int i = 0; i < 100000; i++){lock (lockObj){counter++;}}}
}
以上示例创建了两个线程来同时递增一个共享计数器变量。为了确保线程安全,我们使用 lock 语句将对共享资源的访问限制在一次只有一个线程进行。最终输出的计数器值应该是 200,000。
回滚
回滚是指撤销或取消已经执行的操作以返回到先前的状态。在 C# 中,你可以使用事务 (Transaction) 来实现回滚操作。事务允许你将多个相关操作包装在一起,并要么全部成功,要么全部失败。如果发生失败,可以回滚整个事务以恢复到初始状态。
以下是一个使用 TransactionScope 的回滚示例:
using System;
using System.Transactions;public class Program
{public static void Main(){using (var scope = new TransactionScope()){try{// 执行一些数据库操作或其他事务性操作// 提交事务scope.Complete();}catch (Exception ex){// 回滚事务Console.WriteLine("An error occurred: " + ex.Message);}}}
}
在以上示例中,我们使用 TransactionScope 来创建一个新的事务范围。在事务范围内执行的操作将受到该事务的管理。如果出现异常或未调用 scope.Complete(),事务将自动回滚。
并行编程
并行编程是指同时执行多个任务以提高程序性能的编程范例。在 C# 中,你可以使用 Task 和 Parallel 类来实现并行编程。以下是一个使用 Parallel.ForEach 进行并行迭代的示例:
using System;
using System.Threading.Tasks;public class Program
{public static void Main(){int[] numbers = { 1, 2, 3, 4, 5 };Parallel.ForEach(numbers, number =>{Console.WriteLine("Processing number: " + number);// 执行一些操作});}
}
以上示例使用 Parallel.ForEach 方法在多个线程中并行迭代给定的集合。每个数字都被发送到不同的线程进行处理,从而加快整体处理速度。
异步编程
异步编程允许在等待某些长时间运行的操作完成时释放主线程,以避免阻塞用户界面或其他任务。在 C# 中,你可以使用 async 和 await 关键字来实现异步编程。以下是一个异步方法的示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;public class Program
{public static async Task Main(){await DoSomethingAsync();}public static async Task DoSomethingAsync(){HttpClient httpClient = new HttpClient();string result = await httpClient.GetStringAsync("https://www.example.com");Console.WriteLine(result);}
}
以上示例中的 DoSomethingAsync 方法执行了一个 HTTP 请求,并在等待请求完成时释放主线程。这样可以确保应用程序在请求期间仍然响应其他操作。
反射
反射是一种在运行时检查和修改类型、对象和成员信息的能力。在 C# 中,你可以使用 System.Reflection 命名空间中的类来实现反射。以下是一个使用反射获取和调用方法的示例:
using System;
using System.Reflection;public class Program
{public static void Main(){Type type = typeof(MyClass);// 获取方法信息MethodInfo methodInfo = type.GetMethod("MyMethod");// 创建实例object instance = Activator.CreateInstance(type);// 调用方法methodInfo.Invoke(instance, null);}
}public class MyClass
{public void MyMethod(){Console.WriteLine("Hello from MyMethod!");}
}
以上示例使用反射获取了 MyClass 类的 MyMethod 方法的信息,并通过反射调用该方法。这使得我们可以在运行时动态地发现和调用类型和成员。
相关文章:
C# 消息队列、多线程、回滚、并行编程、异步编程、反射
消息队列 消息队列是一种在应用程序之间传递消息的异步通信机制。它可以使应用程序解耦并提高系统的可伸缩性和可靠性。在 C# 中,你可以使用多个消息队列技术,其中一种广泛使用的技术是 RabbitMQ。 RabbitMQ 是一个开源的消息代理,实现了高…...
汇编代码生成和编译器的后端
1.前置程序:语义分析和中间代码生成 基于SLR(1)分析的语义分析及中间代码生成程序-CSDN博客https://blog.csdn.net/lijj0304/article/details/135097554?spm1001.2014.3001.5501 2.程序目标 在前面编译器前端实现的基础上,将所生成的中间代码翻译成某…...
MySQL 8.0中新增的功能(九)
FROM_UNIXTIME()、UNIX_TIMESTAMP()和CONVERT_TZ()的64位支持 根据MySQL 8.0.28版本的更新,FROM_UNIXTIME()、UNIX_TIMESTAMP() 和 CONVERT_TZ() 函数现在在支持64位的平台上处理64位值。这包括64位版本的Linux、MacOS和Windows。在兼容的平台上,UNIX_T…...
QT基础篇(8)QT5模型视图结构
1.概述 QT5的模型视图结构主要包括模型(Model)、视图(View)和委托(Delegate)三个部分。 模型(Model):模型是数据的抽象表示,负责存储和管理数据。它可以是自…...
vue3-响应式基础之reactive
reactive() 还有另一种声明响应式状态的方式,即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同,reactive() 将使对象本身具有响应性: 「点击按钮1」 <script lang"ts" setup> import { reactive } from vuec…...
【ceph】如何将osd的内容挂载出来---ceph-objectstore-tool 实现
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
怎样实现安全便捷的网间数据安全交换?
数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换,则是需要进行跨网络、跨网段甚至跨组织地进行数据交互,对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…...
微信小程序定义并获取日志/实时log信息
步骤一:开通实时日志 可以在开发者工具->详情->性能质量->实时日志,点击前往,在浏览器打开we分析界面: 也可登录小程序管理后台,点击统计进入we分析: 在we分析界面找到性能质量,打开实…...
海外代理IP怎么用?常见使用问题及解决方案
海外代理IP是指提供全球范围内的代理服务器,代理服务器充当IP与目标网站之间的中介,可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中,用户可能会遇到各种挑战,如连接问题、速度慢等。理解这些问题的原因并…...
DP:数位DP
数位DP的大致思想:枚举每一位能选取的合法值。 1. LC 2376 统计特殊整数 说是DP,但实际上状态转移方程挺难写的,毕竟是枚举集合论,这里就不贴状态转移方程了。总体的写法其实是搜索记忆化。之所以称之为DP,是因为&am…...
js逆向第21例:猿人学第20题新年挑战
文章目录 一、前言二、定位加密参数1、定位wasm加密2、反编译wasm3、定位sign加密三、代码实现四、参考文献一、前言 新春福利:抓取这5页的数字,计算加和并提交结果 二、定位加密参数 通过get请求地址可以看到需要搞定参数有page、sign、t如下图: 进入堆栈不难发现这样一…...
贪心+蓝桥杯
原题路径 题目思路 : 思路很简单,肯定是贪心做法,要使总代价最小,需用那些出现次数比avg多的数来替换那些没有出现或者是出现次数少于avg的数, 所以我们存当前数每次出现的代价是多少 ,枚举每一个 0 - 9 之间的数 ,如果当前数出现…...
第二篇:新建node项目并运行
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 安装 Node.js:首先,确保你的…...
阳光保险选择OceanBase稳定运行超700天
阳光保险集团成立于 2005 年 7 月,旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司,是全球市场化企业中成长最快的集团公司之一,目前位列中国保险行业前八。随着数字化升级趋势的不断加速,很多企业产生将软硬…...
最强大脑闪电心算草稿1
#include<bits/stdc.h> #include<windows.h> using namespace std; int main() {double speed,n,op,sum0;int ans;srand(time(NULL));cout<<"请输入加(1)/减(2)/加减混合(3):";cin>>op;cout<<"请输入题目数量:";cin>>…...
融优学堂-艺术史
导论4 1.【单选题】根据导论的讲解,下列表述正确的是()。(1)艺术品是因人的活动而被创造出来的人工制品。(2)许多物品被制造出来时,最初的目的是满足某种实用的用途,而不…...
༺༽༾ཊ—设计-七个-07-原则-模式—ཏ༿༼༻
第七原则:迪米特职责 类与类之间的耦合度尽可能低 换言之,我们可以理解成———只与直接朋友说话,不跟陌生人说话 直接朋友: 通过方法传参传进来的朋友, 类自己的字段, 构造函数进来的也是直接朋友&…...
一篇文章带你搞懂---全排序
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 全排序(Permutation)是指将一组元素按照一定的顺序进行排列的过程。在计算机科学中,全排序是一…...
提升问题检索的能力
事实上,在信息极度丰富的时代,信息检索和筛选能力格外重要。一些搜索引擎的出现已极大地方便了我们日常的信息检索,此处需要注意的是我们不能仅仅局限于常见的搜索引擎,也需要关注和积累一些专业平台或是具有集成功能的引擎&#…...
软件测试|SQLAlchemy query() 方法查询数据
简介 上一篇文章我们介绍了SQLAlchemy 的安装和基础使用,本文我们来详细介绍一下如何使用SQLAlchemy的query()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型,也可以复用上一篇文章中我们创建的模型,代码如…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
