一个缓存泛型自动处理队列,留有处理事件接口

在C#中,创建一个通用泛型缓存队列工具通常涉及到使用泛型(T)来支持任意类型的队列项,并且实现先进先出(FIFO)的队列逻辑。为了提供自动处理和事件通知的功能,我们可以使用后台线程来处理队列中的项,并通过事件或委托来通知监听者队列的状态变化。

以下是一个简单的泛型缓存队列工具的示例,它使用了System.Collections.Concurrent命名空间下的BlockingCollection作为线程安全的队列,并通过Task在后台自动处理队列中的项。它还定义了一个事件,当队列中的项被处理时可以触发该事件。

csharp
using System;  
using System.Collections.Concurrent;  
using System.Threading;  
using System.Threading.Tasks;  public class GenericCacheQueue<T>  
{  private readonly BlockingCollection<T> _queue = new BlockingCollection<T>();  private Task _processingTask;  private CancellationTokenSource _cancellationTokenSource;  // 定义事件,当项被处理时触发  public event Action<T> ItemProcessed;  // 添加项到队列中  public void Enqueue(T item)  {  _queue.Add(item);  }  // 开始处理队列中的项  public void StartProcessing()  {  _cancellationTokenSource = new CancellationTokenSource();  _processingTask = Task.Run(() => ProcessQueue(_cancellationTokenSource.Token), _cancellationTokenSource.Token);  }  // 停止处理队列中的项并清理资源  public void StopProcessing()  {  _cancellationTokenSource.Cancel();  try  {  _processingTask.Wait();  }  catch (AggregateException ae)  {  // 处理任务取消的异常  foreach (var innerException in ae.InnerExceptions)  {  if (innerException is OperationCanceledException)  {  // 忽略由于取消而产生的异常  }  else  {  // 处理其他异常  throw;  }  }  }  _queue.CompleteAdding(); // 标记添加完成,以便消费者知道何时退出循环  }  // 后台处理队列中的项  private void ProcessQueue(CancellationToken cancellationToken)  {  foreach (var item in _queue.GetConsumingEnumerable(cancellationToken))  {  // 处理项  ProcessItem(item);  }  }  // 处理单个项的逻辑  private void ProcessItem(T item)  {  // 在这里添加处理项的逻辑  Console.WriteLine($"Processing item: {item}");  // 触发事件通知项已被处理  ItemProcessed?.Invoke(item);  }  }

使用上述GenericCacheQueue类时,你需要实现自己的处理逻辑,并在需要的时候触发ItemProcessed事件。下面是如何使用这个队列的示例:

csharp
class Program  
{  static void Main(string[] args)  {  var cacheQueue = new GenericCacheQueue<int>();  cacheQueue.ItemProcessed += CacheQueue_ItemProcessed; // 订阅事件  cacheQueue.StartProcessing(); // 开始处理队列中的项  // 添加一些项到队列中  for (int i = 0; i < 10; i++)  {  cacheQueue.Enqueue(i);  }  // 等待一段时间,让后台线程处理队列中的项  Thread.Sleep(2000);  cacheQueue.StopProcessing(); // 停止处理并清理资源  }  private static void CacheQueue_ItemProcessed(int item)  {  // 当项被处理时,这里的代码将被执行  Console.WriteLine($"Item {item} processed.");  }  
}

请注意,上述代码示例是一个简化的版本,用于演示如何构建这样的工具。在实际应用中,你可能需要添加更多的错误处理逻辑、日志记录、性能优化以及更复杂的处理逻辑。此外,对于大型或生产环境的应用,你可能需要考虑使用更高级的并发控制机制或队列服务(如RabbitMQ、Azure Service Bus等)。

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

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

相关文章

【禅道客户案例】同方智慧能源数智化转型新实践 禅道助力前行

同方智慧能源是同方股份有限公司的骨干企业。依托中核集团、清华大学的科技优势&#xff0c;坚持技术和资源双核驱动&#xff0c;基于30多年行业积淀&#xff0c;面向建筑、交通、工业、北方供热、数据中心等主要用能场景提供设计咨询、产品技术、投资建设、运营服务&#xff0…

Redis集合 set 详解

Set简介 set 类似于 Java 中的 HashSet ,是redis中的一种数据结构&#xff0c;它是一个无序并且唯一的键值集合&#xff0c;并且储存时不会按照插入的先后顺序进行.一个集合中最多可以储存2^32 -1个元素。当你需要存储一个列表数据&#xff0c;又不希望出现重复数据时&#xf…

day26 java lambda

lambda lambda表达式 &#xff1a;对匿名内部类的对象的一种简写lambda表达式的格式 : (形参列表) -> {方法体}说明 &#xff1a;-> : lambda操作符 例:&#xff1a;Comparator 原代码&#xff1a; Collections.sort(list, new Comparator<Integer>() {Override…

DELL PowerEdge服务器通过iDRAC升级BIOS遇到的问题

本文对PowerEdge 12G系统&#xff0c;也就是iDRAC 7版本升级BIOS中遇到的几个问题做个总结&#xff0c;对于其他版本理论上应该也是适用的。如果还遇到其他问题&#xff0c;可以添加VX&#xff0c;VX号为 StorageExpert 进行进一步的分析探讨。 第一个问题&#xff0c;成功下载…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…

ZABAPGIT问题,导入github上的程序包时报 DBSQL_DUPLICATE_KEY_ERROR

跟踪程序发现在94050行 INSERT seocompotx FROM TABLE it_descriptions 报的错 刚开始&#xff0c;不想着改动他&#xff0c;把seocompotx 表的数据做下指定清楚&#xff0c;但是5次清楚后&#xff0c;果断注释掉 改成 MODIFY seocompotx FROM TABLE it_descriptions。 在用…

航片水体空洞修补

水体空洞情况如下图所示&#xff1a; 水体空洞修补结果如下图所示&#xff1a; 操作视频教程&#xff1a; MCM智拼图软件V8.5-漏洞空洞修补-水体修补_哔哩哔哩_bilibili

鸿蒙OpenHarmony【小型系统 编译】(基于Hi3516开发板)

编译 OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式&#xff0c;build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 使用build.sh脚本编译源码 进入源码根目录&#xff0c;执行如下命令进行版本编译。 ./build.sh --product-name name --ccache 说明&…

基于LDLT分解求解Ax=b

前置知识&#xff0c;矩阵 A T ∗ A A^T * A AT∗A的性质&#xff1a; 实对称性&#xff1a;如果 A A A是实矩阵&#xff0c;那么 A T ∗ A A^T * A AT∗A是实对称矩阵。这意味着 ( A T ∗ A ) T A T ∗ ( A T ) T A T ∗ A (A^T * A)^T A^T * (A^T)^T A^T * A (AT∗A)…

基于数据挖掘的斗鱼直播数据可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着网络直播平台的兴起&#xff0c;斗鱼直播作为其中的佼佼者&#xff0c;吸引了大量用户和观众。为了更好地理解和分析斗鱼直播中的数据&#xff0c;本项目介绍了一个基于数据挖掘的斗鱼直播数据…

【AI导师写作】毕业论文答辩PPT生成

无论是大专、本科或者硕博&#xff0c;撰写毕业论文、开题报告、文献综述、任务书、课程论文、调研报告等都是必不可少的一件事。而这些任务重往往都需要我们花费大量的时间和精力&#xff0c;而“AI导师写作”在这一方面无疑提供了高效和便捷。可毕业季的论文答辩也是每个学者…

C#调用skiasharp实现绘制并拖拽图形

SkiaSharp是基于.net的跨平台二维图形库&#xff0c;封装的谷歌的Skia库&#xff0c;SkiaSharp支持在以下平台或运行时中使用&#xff0c;能够在图片中绘图&#xff0c;也提供控件在Winform、WPF等使用。本文学习skiasharp在Winform的基本用法&#xff0c;并参照参考文献5实现绘…

【Java那些年系列-启航篇 04】Java程序架构:深入理解类与对象的设计原则

作者名称&#xff1a;纸飞机-暖阳 作者简介&#xff1a;专注于Java和大数据领域&#xff0c;致力于探索技术的边界&#xff0c;分享前沿的实践和洞见 文章专栏&#xff1a;Java那些年专栏 专栏介绍&#xff1a;本专栏涵盖了 Java SE从基础语法到面向对象编程&#xff0c;从异常…

一键PDF水印添加工具

一键PDF水印添加工具 引言优点1. 精准定位与灵活布局2. 自由旋转与透明度调控3. 精细化页码选择4. 全方位自定义水印内容5. 无缝整合工作流程 功能详解结语工具示意图【工具链接】 引言 PDF作为最常用的文档格式之一&#xff0c;其安全性和版权保护显得尤为重要。今天&#xff…

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第3节( 委托的概念)

10.3.2 委托的概念 ​ 乍一看&#xff0c;委托这项技术的目标可能并不明确&#xff0c;但它却是Object Pascal 组件技术的基石之一。秘密就在委托这个词上。如果有人创建了一个对象&#xff0c;这个对象有一些方法指针&#xff0c;那么你只需把新的方法赋值给这些指针&#xf…

[移动端] “viewport“ content=“width=device-width, initial-scale=1.0“ 什么意思

布局视口, 代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body,html {margin: 0;padding: 0;}.box {width: 200px;height: 200px;background-color: pi…

数据库基础:理解与应用索引与视图

文章目录 前言 索引视图 前言 数据库管理涉及索引、视图。本基础篇不涵盖索引和视图的高级应用和核心概念。 索引 MySQL索引是提高查询性能的数据结构&#xff0c;类似于书籍目录&#xff0c;帮助数据库快速找到数据行&#xff0c;避免全表扫描。索引可应用于单列或多列&a…

vue 项目关于不同分辨率的电脑网页适配方案

流式布局&#xff1a;这是一种相对灵活的布局方式&#xff0c;页面的元素宽度使用相对宽度&#xff08;例如百分比&#xff09;来定义&#xff0c;而不是使用绝对宽度&#xff08;例如像素&#xff09;。这样&#xff0c;当浏览器窗口大小变化时&#xff0c;元素会自动调整大小…

CocoaPods使用详解

CocoaPods使用详解 引言 在iOS开发过程中&#xff0c;第三方库的集成是一个常见的需求。CocoaPods作为一个流行的依赖管理工具&#xff0c;能够大大简化这一过程。它允许开发者通过一个名为Podfile的配置文件来管理项目中的第三方库。本文将详细介绍CocoaPods的安装、基本使用…

Linux学习_09-Linux的用户管理

账号和用户组 系统管理员的主要工作就是管理账号。我们先来了解一下linux系统是如何识别每个用户的。 用户标识符&#xff1a;UID和GID linux的用户至少有2个ID&#xff0c;也就是UID用户ID和GID用户组ID。虽然登录的时候输入的是用户名&#xff0c;但其实系统识别的是这个两…