热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中使用Channels进行异步排队

本篇文章是对如何在asp.netcore的webapi中使用Channels的简单介绍引子设想一下我们有这样一个典型的生产者消费者问题,我在controller上收

本篇文章是对如何在asp.net core 的web api中使用Channels的简单介绍

引子

设想一下我们有这样一个典型的生产者/消费者问题,我在controller 上收到一个请求并希望通过后台服务执行任务。
相信你的第一个想法是使用一些外部的消息队列来实现,如 RabbitMQ 或Kafka,这对于这样的一个简单任务来说这些组件都有点重了。所以我决定在不使用任何外部消息队列的情况下实现它。

所以我的第一次尝试是使用ConcurrentQueue和一些锁,但它变得很复杂。所以我尝试搜索一些更简单的方式,直到我找到了“Channels”。

Channels是什么

一个 Channel 是一个 . NET 数据结构或集合,我们可以在其中存储来自生产者的数据,同时消费者可以检索它,而无需从我们这边进行任何额外的同步。

生产者/消费者描述了生产者发布消息的行为,并且有一个或多个消费者可以对该消息进行处理,但每条消息只能读取一次。它不会对每个订阅者进行重复消费。换句话说就是,消费者之间是竞争消费。

例子

当我搜索示例时,我发现了很多控制台应用程序示例,但没有针对 Web API的,因此我决定尝试以 ASP.Net Core Web API 项目为例来进行演示

所以让我们开始吧。

在 Visual Studio 中创建一个 Web API 项目,或者您可以使用下面的 cmd命令进行创建

dotnet new webapi -o LearningChannels

现在为了简单起见,我使用两个后台任务,一个用于生产者,一个用于消费者。

WriterService

ReaderService

而对于ASP.NET Core Web API,最重要的部分是定义通道和依赖注入。

我们已经完成了更改。

让我们测试一下。运行应用程序

正如我们在输出窗口中看到的那样,一旦数据写入Channels,消费者就会读取它。

现在,如果您在我的示例中注意到我使用了无界Channels。

那是什么,还有什么其他选择。让我们看看他们。

有界Channels和无界Channels

CreateUnbounded方法创建一个对可以存储的项目数量没有限制的channel。当然在某些时候它可能会达到内存的限制,这时候你会得到内存不足的异常。

另一方面,CreateBounded方法可以创建一个具有在创建期间提供的显式数量限制的通道。

有界Channels有一些用于指示不同行为的选项,BoundedChannelFullMode

public enum BoundedChannelFullMode
{Wait,DropNewest,DropOldest,DropWrite
}

默认为Wait,等待队列中有空间时写入。因此TryWrite将为此类channel返回 false

DropOldest将删除“最旧”的数据。

DropNewest将删除最新的数据。

DropWrite删除当前正在写入的数据。

因此,您可以根据你的场景选择适合的选项。

总结

在本教程中,我们已经了解了通道如何在应用程序中处理异步任务时发挥作用。

希望你喜欢阅读它。

快乐编码并继续学习..!

参考阅读:

https://medium.com/@niteshsinghal85/using-channels-for-asynchronous-queuing-in-c-ed96c51d4576


推荐阅读
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • Windows 7集成IE11:离线安装包与系统补丁全面解析
    在将Internet Explorer 11集成到Windows 7系统中时,需预先安装多个关键系统补丁,包括KB2731771、KB2786081、KB2834140、KB2670838、KB2729094和KB2888049。这些补丁不仅确保了系统的兼容性和稳定性,还为IE11的顺利安装提供了必要的支持。此外,建议在安装过程中遵循官方文档中的步骤,以避免潜在的兼容性问题。 ... [详细]
  • 如何在C#中配置组合框的背景颜色? ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • C#编程中按钮控件的使用与优化 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在更换电脑或重装系统时,用户经常需要处理诸如备份收藏夹、电子邮件、用户配置文件和常用文档等任务。尽管这些操作并不复杂,但却相当繁琐。本文介绍了一种利用Windows 7中的“轻松传送”功能,高效便捷地在两台电脑之间同步数据的方法,大大简化了这一过程。 ... [详细]
  • 如何解决Windows 7系统中蓝牙耳机驱动程序安装失败的问题? ... [详细]
  • Microsoft Visual Studio 2010 简体中文旗舰版安装与下载详细报告
    最近得知MSDN发布了Microsoft Visual Studio 2010简体中文旗舰版,我怀着极大的兴趣进行了下载和安装。本文将详细介绍下载和安装的全过程。如果您拥有MSDN订阅账号,可以通过以下链接访问下载页面:https://msdn.microsoft.com。此外,文中还提供了详细的步骤说明和常见问题的解决方案,帮助用户顺利完成安装。 ... [详细]
author-avatar
大爱仅有的财产丶_468
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有