C#请求队列后台服务

队列执行

1、首先需要一个公共类里面有我们的队列需要执行的方法

这个方法最好是一个单独的不受别的控制器影响的class。因为你如果声明错位置的话一不小心就会把我们的队列重置。导致队列内容丢失造成损失。大家如果有某些方法运行时间太长但又需要快速给出结果,就可以利用队列,我们这边直接给她结果。然后具体操作我们在内部慢慢执行。

// 比如说我这里新建一个Class专门用来存放这个方法和队列内容容器
public class QueueTesting
{// 全局变量 容器类型。其中ReqParameters是我生命的一个实体类,我要这个队列里面存储的是这个类型。当然大家需要什么类型就存储什么类型就行了。public static ConcurrentQueue<ReqParameters> requestQueue = new ConcurrentQueue<ReqParameters>();// 构造函数 可有可无,目前我这里并没有用构造函数一致初始化。后续中直接在Startup中注册一下服务public QueueTesting{}// 接下来就是具体方法了public async Task ProcessRequestQueue(CancellationToken cancellationToken){while (true){// 检查队列是否有请求,并将请求从队列中取出if (requestQueue.TryDequeue(out ReqRoomStatus_Price_timeandbhid request)){// 取出我们想要的参数,也就是上述我说的我生命的实体类中的属性string id = request.id;// 通过ID从 _odb 对象中异步获取订单信息// 这也是某些方法我查了一下数据库读取出我想要的数据根据idObject object = await _odb.OrdersByOidAsync(id);// 检查订单是否为空if (object == null){// 如果我查找的对象为空,记录错误日志Logger.LogError($"错误日志记录随意记录!!!!!");}else{//!!!!!!!!!!!!! 这一步就是我们要队列具体执行的方法了!!!!!!// 就是因为我这个内部方法耗时严重!!所以我才要创建队列领出来单独执行的// 如果对象不为空,使用 _orderUtil 对象异步提交对象order = await _orderUtil.SubmitOrderAsync(order);//!!!!!!!!!!!!! 这一步就是我们要队列具体执行的方法了!!!!!!}}else{// 当队列为空时,等待一段时间再继续处理await Task.Delay(1000, cancellationToken);}// 如果你希望在队列为空时跳出循环,可以取消注释以下代码//if (requestQueue.IsEmpty)//{//    break;//}}}}

2、准备一个启动服务类,用来启动服务

后面我们要在Startup里面初始化注册一下这个服务。

public class RequestQueueBackgroundService : BackgroundService
{private readonly QueueTesting _requestQueueController;// 构造函数,接受一个 QueueTesting 对象作为参数public RequestQueueBackgroundService(QueueTesting requestQueueController){_requestQueueController = requestQueueController;}// 重写 BackgroundService 类中的 ExecuteAsync 方法protected override async Task ExecuteAsync(CancellationToken stoppingToken){// 调用 _requestQueueController 对象的 ProcessRequestQueue 方法,传入 stoppingToken 参数await _requestQueueController.ProcessRequestQueue(stoppingToken);}
}

3、注册启动服务

在Startup里面注册一个我们刚才重写的服务

services.AddHostedService<RequestQueueBackgroundService>();

我总结来说就是定义了一个后台服务类,用于处理请求队列。它依赖于 QueueTesting 类来处理请求队列的操作,然后在具体的耗时方法哪里把耗时方法添加到队列让他不影响整体运行时长。

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

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

相关文章

SQL必知必会笔记(9~12章)

第九章 汇总数据 1、聚集函数用来进行记录数据的加工&#xff0c;然后再进行返回。 2、SQL的聚集函数&#xff1a; 函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和 3、AVG()函数 A…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Azure AI 内容安全Content Safety Studio实战

Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API&#xff0c;可用于检测有害材料。 交互式 Content Safety Studio&#xff0c;可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…

项目框架构建之6:编写通用主机基础类

本文是“项目框架构建”系列之6&#xff0c;本文介绍如何编写通用主机基础类。 1.为了构建通用主机&#xff0c;我们先创建主机接口IAppHost接口 接口需要有配置项&#xff0c;我们定义为HostConfiguration&#xff0c;比如我们希望用户可以设定他的工作目录&#xff0c;就可…

深度学习|4.7 参数和超参数

4.7 参数和超参数 超参数是指需要用户提前设置好的参数&#xff0c;这些超参数最终会影响到参数的数值&#xff08;相当于参数是动态调整得到的&#xff09; 学习率的选取 最优学习率应该能使得代价函数趋于一个较低的常数。

接口工具Apifox

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Apif…

CSS 发光输入框动画

<template><view class="content"><input placeholder="请输入..." class="input" /> </view> </template><script></script><style>/* 设置整个页面的背景颜色为 #212121 */body{background-c…

react native中使用tailwind并配置自动补全

使用的第三方库是tailwind-react-native-classnames&#xff0c;同类的也有tailwind-rn&#xff0c;但是我更喜欢前者官方demo&#xff1a; import { View, Text } from react-native; import tw from twrnc;const MyComponent () > (<View style{twp-4 android:pt-2 b…

【办公技巧】excel中设置选项按钮的方法

大家是否会遇到需要勾中选项的情况&#xff0c;我们可以在电子表格中制作出可以勾选、选中的选项按钮&#xff0c;今天我们一起学习一下设置方法。 首先&#xff0c;我们需要先在excel工具栏中添加一个功能模块&#xff1a;开发工具 依次点击excel中的文件 – 选项 – 自定义…

第二百五十三回

文章目录 概念介绍使用方法示例代码 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flutter提供了多种进度条组件&#xff0c;常用的是水平进度条&#xff1a;LinearProgressIndicator&#xff1b;圆形进度条 :CircularProgressIndicator和R…

2023年,To B资本航船走向哪了?

国内To B领域在去掉泡沫、结束资本狂欢之后&#xff0c;投资决策愈加理性。但与此同时&#xff0c;下滑的步伐正在放慢&#xff0c;交易数量和金额的降低逐渐放缓&#xff0c;市场逐渐走向稳定。 作者|斗斗 编辑|皮爷 出品|产业家 2023年&#xff0c;在一众业内人士的眼中&…

文件系统与日志分析

一&#xff0c;文件系统 &#xff08;一&#xff09;inode 和block概述 1&#xff0c;文件数据包括元信息与实际数据 2&#xff0c;文件存储在硬盘上&#xff0c;硬盘最小存储单位是“扇区”&#xff0c;每个扇区存储512字节 3&#xff0c;block (块) 连续的八个扇区组成一…

从零开始了解Figma:全面介绍这款设计工具,让你熟练运用!

什么是Figma&#xff1f; 它是一个类似于Sketch或XD的UI设计工具&#xff0c;但Figma和后两者的本质区别在于它是基于web的&#xff0c;也就是说&#xff0c;只要有浏览器和网络&#xff0c;它就可以打开和使用。 Figma为什么强大&#xff1f; Windows上最好的UI设计工具 由…

pandas数据处理优化过程记录

问题现状:数据量60w条的dataframe,需要进行一些条件判断和计算,一般为满足某条件的则进行加减乘除计算,不满足的则为0,比如: result_frame[aaa] = np.vectorize(lambda x, y: 0 if y == 0 else x / y)(base_frame[bbb], base_frame[ccc]) 但是不知道为什么,使用这种方…

Redisson 源码解析 - 分布式锁实现过程

一、Redisson 分布式锁源码解析 Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上&#xff0c;充分的利用了Redis键值数据库提供的一系列优势&#xff0c;在Java实用工具包中常用接口的基础上&#xff0c;为使用者提供了一系列具有分布式特性的常…

一文搞定JMM核心原理

公众号《鲁大猿》&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn &#xff08;架构技术.cn&#xff09; JMM引入 从堆栈说起 JVM内部使用的Java内存模型在线程栈和堆之间划分内存。 此图从逻辑角度说明了Java内存模型&#xff1a; # 堆栈里…

SpringBoot + Mybatis 实现多数据源原来如此简单

1、为什么需要整合多数据源 在开发的过程中&#xff0c;我们可能会遇到一个工程使用多个数据源的情况&#xff0c;总体而言分为以下几个原因 a、数据隔离&#xff1a;将不同的数据存储在不同的数据库中&#xff0c;如多租户场景 b、性能优化&#xff1a;将数据分散到多个数据库…

【野火i.MX6ULL开发板】利用microUSB线烧入Debian镜像

0、前言 烧入Debian镜像有两种方式&#xff1a;SD卡、USB SD卡&#xff1a;需要SD卡&#xff08;不是所有型号都可以&#xff0c;建议去了解了解&#xff09;、SD卡读卡器 USB&#xff1a;需要microUSB线 由于SD卡的网上资料很多了&#xff0c;又因为所需硬件&#xff08;SD卡…

Spring应用的部署与管理

一、前言 部署是将开发好的应用发布到服务器上&#xff0c;使其能够被用户访问的关键步骤。Spring框架提供了灵活的部署选项&#xff0c;本文将介绍Spring应用的常见部署方式和一些建议&#xff0c;帮助开发者顺利将应用投放到生产环境。 二、传统部署方式&#xff1a;WAR包 传…

09Bean的生命周期及循环依赖

Spring其实就是一个管理Bean对象的工厂。它负责对象的创建&#xff0c;对象的销毁等。 所谓的生命周期就是&#xff1a;对象从创建开始到最终销毁的整个过程。 Bean的生命周期之5步 ● 第一步&#xff1a;实例化Bean(无参构造方法执行) ● 第二步&#xff1a;Bean属性赋值(注…