一个支持异步方法和支持高性能多线程的工具集合
这个库提供了两个不同的包可以给大家安装。其中一个包是传统的 Dll 引用包。另一个包是使用 SourceYard 打出来的源代码包,源代码包安装之后将会引用源代码
.NET CLI:
dotnet add package dotnetCampus.AsyncWorkerCollection
PackageReference:
<PackageReference Include="dotnetCampus.AsyncWorkerCollection" Version="1.2.1" />
.NET CLI:
dotnet add package dotnetCampus.AsyncWorkerCollection.Source --version 1.2.1
PackageReference:
<PackageReference Include="dotnetCampus.AsyncWorkerCollection.Source" Version="1.2.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
安装源代码包将会让你的项目引用的是 dotnetCampus.AsyncWorkerCollection 的 C# 源代码,而不是 dll 程序集。使用此方法可以减少 dll 文件以及程序集的引入
高性能内存生产者消费者队列,支持多线程入队和多线程等待出队
最简使用方法
// 下面的 FooTask 是任意自定义类
var asyncQueue = new AsyncQueue<FooTask>();
// 线程1
asyncQueue.Enqueue(new FooTask());
// 线程2
var fooTask = await asyncQueue.DequeueAsync();
详细请看 dotnet 使用 AsyncQueue 创建高性能内存生产者消费者队列
双缓存任务和双缓存类,支持多线程快速写入和单线程读取批量的数据,支持等待缓存执行完成
最简使用方法
var doubleBufferTask = new DoubleBufferTask<Foo>(list =>
{
// 执行批量的 List<Foo> 任务的方法
// 这个传入的委托将会在缓存有数据时被调用,每次调用的时候传入的 list 列表至少存在一个元素
});
// 其他线程调用 AddTask 方法加入任务
doubleBufferTask.AddTask(new Foo());
// 在业务端完成之后,调用 Finish 方法表示不再有任务加入
// 此 Finish 方法非线程安全,必须业务端根据业务调用
doubleBufferTask.Finish();
// 其他线程可以调用 WaitAllTaskFinish 等待缓存所有任务执行完成
// 在调用 Finish 方法之后,缓存的所有任务被全部执行之后将会返回
await doubleBufferTask.WaitAllTaskFinish();
详细请看 dotnet 双缓存数据结构设计 下载库的文件写入缓存框架
异步版本的 AutoResetEvent 锁
功能上和 AutoResetEvent 相同,只是将 WaitOne 替换为 WaitOneAsync 用于支持异步等待
详细请看 C# dotnet 高性能多线程工具 AsyncAutoResetEvent 异步等待使用方法和原理
异步版本的 ManualResetEvent 锁
功能上和 ManualResetEvent 相同,只是将 WaitOne 替换为 WaitOneAsync 用于支持异步等待
支持本机内多线程调用某一确定的任务的执行,任务仅执行一次,多次调用均返回相同结果
在任务执行完成之后,可以重置任务状态,让任务再次执行
如用来作为执行 同步 这个业务的工具。也就是在 同步 这个业务执行过程中,不允许再次执行 同步 这个业务。同时只要同步过了,那么再次调用只是返回同步结果。只有在同步之后状态发生变更之后,才能再次同步