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()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型,也可以复用上一篇文章中我们创建的模型,代码如…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
