Anduin Xue
Anduin Xue

Anduin's Tech Blog

Async


C# run tasks in a threads pool with fixed size

本文提出了一种基于C#的固定线程池任务调度方案通过线程安全队列实现动态任务分配解决了多核CPU资源利用与任务池扩展性之间的平衡问题。方案通过SafeQueue实现并发安全的任务队列管理CannonQueue服务则采用动态调度策略在保持最大并行度的同时支持任务池的动态扩展。当检测到线程空闲时自动触发任务分配机制确保核心资源的持续利用。针对依赖注入场景设计了QueueWithDependency方法通过服务作用域隔离解决了实体框架等依赖的生命周期问题。方案支持三种使用模式:即时启动的队列模式延迟启动的批量处理模式以及无等待的火并忘记模式。实现中通过Task.WhenAny实现非阻塞任务监控并通过日志记录实时展示任务运行状态。该方案引发的思考包括:如何在不同硬件配置下自适应调整并行度?当任务处理时间差异较大时如何优化资源分配?如何设计任务失败的重试机制?以及在高并发场景下如何平衡内存占用与吞吐量?--Qwen3

C# Async Task Multi-Threading async programming task queue

Fire and forget in ASP.NET Core with dependency alive

在ASP.NET Core中实现fire and forget模式时,开发者常通过Task.Run启动异步任务但可能忽略依赖项生命周期管理。当控制器触发耗时任务后自身即被释放,导致注入的依赖可能提前销毁从而中断任务执行。文章揭示了直接在控制器中调用Task.Run的潜在风险,提出通过单例服务CannonService解决依赖存活问题的创新方案。该服务利用IServiceScopeFactory动态创建作用域,确保任务执行期间依赖项始终有效。通过将耗时操作迁移至单例服务中执行,既避免阻塞主线程又能保持依赖存活,同时引入异常处理机制增强任务健壮性。这种设计模式突破了传统依赖注入的生命周期限制,为长时异步任务提供了优雅的解决方案。文章最后抛出值得深思的问题:当任务依赖多个作用域服务时,如何平衡资源占用与任务可靠性?当系统负载剧增时,这种基于Task.Run的调度策略是否存在潜在瓶颈?或许我们该重新审视fire and forget在现代云原生架构中的最佳实践。--Qwen3

ASP.NET Core C# Async Fire and forget dependency injection singleton service

How to run async method in C# synchronous method

本文探讨了C#中同步方法调用异步方法的实现方案及其潜在影响。当开发者在构造函数接口方法或抽象类方法中遇到无法使用await关键字的限制时AsyncHelper工具类提供了一种突破同步与异步边界的技术方案通过TaskFactory的StartNewUnwrapGetResult组合操作实现了同步上下文中对异步任务的阻塞等待。示例展示了如何通过RunSync方法直接调用异步函数并获取返回值同时保持代码的可读性。这种技术虽然解决了特定场景下的调用需求但引发了一个值得深思的问题:当同步等待异步任务时是否违背了异步编程的本质?开发者在享受这种解决方案便利性的同时需要权衡线程阻塞对程序性能的影响。文章最后延伸提出了两个实践方向:无需等待的后台任务执行方案与基于线程池的任务队列管理机制。这些技术选择背后是否隐藏着更深层次的架构设计哲学?如何在同步与异步之间找到最合适的平衡点?--Qwen3

C# .NET Core Async await async method constructor

  • 1