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()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型,也可以复用上一篇文章中我们创建的模型,代码如…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
