C# dotnet 高性能多线程工具 AsyncAutoResetEvent 异步等待使用方法和原理

本文介绍了C#中基于dotnet的AsyncAutoResetEvent,这是一种高性能的多线程工具,支持异步等待,避免线程阻塞,提高系统性能。适用于多线程竞争访问执行权的场景,如消费队列和限制线程执行的业务。文中详细阐述了其使用方法和工作原理,并提供了示例代码。
摘要由CSDN通过智能技术生成

在 C# 里面配合 dotnet 的 Task 可以作出 AsyncAutoResetEvent 高性能多线程工具,从命名可以看到 AsyncAutoResetEvent 的意思就是支持异步的自动线程等待事件,用于多线程竞争访问执行权,可以用在消费队列或用在限制有限线程执行的业务上

和框架自带的 AutoResetEvent 类 一样的作用,表示线程同步事件在一个等待线程释放后收到信号时自动重置

和框架的不同在于 AsyncAutoResetEvent 使用的是异步等待方法,不会在线程池里面阻塞线程,可以让步线程,让线程去处理其他业务

适用

作用是支持使用方有多个线程方式访问执行权时,全部都会在 WaitOneAsync 里面阻塞,只有调用 Set 时才会释放,每调用一次释放一个

或者预先多次调用 Set 之后,仅有一个 WaitOneAsync 可以进入

线程在 WaitOneAsync 等待通过 await 而不是阻塞,可以回到线程池执行其他业务,这就是高性能的原因

如有一个线程专门用来制造数据,而有很多个线程需要处理这些数据,此时期望有数据的时候可以均衡自动分配给这些线程处理。没有数据的时候这些线程可以回到线程池里面执行其他业务

如我有并行的业务准备做,但是我期望只使用有限数量的线程去做,虽然我能给的业务量大于可以准备使用的线程数量,但是每次使用的线程数量都小于等于我限制的数量

如我有某个任务需要等待其他任务完成之后才能执行,但是可以等待的任务可以超过多个,也就是多个任务中只要有一个完成了,那么我这个任务就能执行。或者说只要曾经有等待的任务完成过,我的这个任务也能执行

注意,这个库不关注于单个任务的性能,因为会涉及返回线程池等,在 WaitOneAsync 可以进入之后还需要等待线程池调度才能继续,也就是如果 WaitOneAsync 可以进入,但是线程池没有线程可用,那么依然不会执行后续内容。这个库的高性能主要是对整体,通过不阻塞线程的方法最大程度提升性能

这个库开始的设计是用在 WPF 的多个动画播放完成以及对应的事件处理上,虽然本文会说到多线程但不意味真的需要使用多个线程处理。基于 WaitOneAsync 是用 await 会出让的原因,可以通过一个主线程玩出多线程的坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值