# AsyncWorkerCollection **Repository Path**: yus1977/AsyncWorkerCollection ## Basic Information - **Project Name**: AsyncWorkerCollection - **Description**: 一个支持异步方法和支持高性能多线程的工具集合 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-04-23 - **Last Updated**: 2023-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dotnetCampus.AsyncWorkerCollection 一个支持异步方法和支持高性能多线程的工具集合 ## 安装 NuGet 包 这个库提供了两个不同的包可以给大家安装。其中一个包是传统的 Dll 引用包。另一个包是使用 [SourceYard](https://github.com/dotnet-campus/SourceYard) 打出来的源代码包,源代码包安装之后将会引用源代码 ### 安装传统 NuGet Dll 库 .NET CLI: ``` dotnet add package dotnetCampus.AsyncWorkerCollection ``` PackageReference: ```xml ``` ### 安装源代码包 .NET CLI: ``` dotnet add package dotnetCampus.AsyncWorkerCollection.Source --version 1.2.1 ``` PackageReference: ```xml all runtime; build; native; contentfiles; analyzers ``` 安装源代码包将会让你的项目引用的是 dotnetCampus.AsyncWorkerCollection 的 C# 源代码,而不是 dll 程序集。使用此方法可以减少 dll 文件以及程序集的引入 ## 使用方法 ### AsyncQueue 高性能内存生产者消费者队列,支持多线程入队和多线程等待出队 最简使用方法 ```csharp // 下面的 FooTask 是任意自定义类 var asyncQueue = new AsyncQueue(); // 线程1 asyncQueue.Enqueue(new FooTask()); // 线程2 var fooTask = await asyncQueue.DequeueAsync(); ``` 详细请看 [dotnet 使用 AsyncQueue 创建高性能内存生产者消费者队列](https://blog.lindexi.com/post/dotnet-%E4%BD%BF%E7%94%A8-AsyncQueue-%E5%88%9B%E5%BB%BA%E9%AB%98%E6%80%A7%E8%83%BD%E5%86%85%E5%AD%98%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%98%9F%E5%88%97.html ) ### DoubleBufferTask 双缓存任务和双缓存类,支持多线程快速写入和单线程读取批量的数据,支持等待缓存执行完成 最简使用方法 ```csharp var doubleBufferTask = new DoubleBufferTask(list => { // 执行批量的 List 任务的方法 // 这个传入的委托将会在缓存有数据时被调用,每次调用的时候传入的 list 列表至少存在一个元素 }); // 其他线程调用 AddTask 方法加入任务 doubleBufferTask.AddTask(new Foo()); // 在业务端完成之后,调用 Finish 方法表示不再有任务加入 // 此 Finish 方法非线程安全,必须业务端根据业务调用 doubleBufferTask.Finish(); // 其他线程可以调用 WaitAllTaskFinish 等待缓存所有任务执行完成 // 在调用 Finish 方法之后,缓存的所有任务被全部执行之后将会返回 await doubleBufferTask.WaitAllTaskFinish(); ``` 详细请看 [dotnet 双缓存数据结构设计 下载库的文件写入缓存框架](https://blog.lindexi.com/post/dotnet-%E5%8F%8C%E7%BC%93%E5%AD%98%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1-%E4%B8%8B%E8%BD%BD%E5%BA%93%E7%9A%84%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98%E6%A1%86%E6%9E%B6.html ) ### AsyncAutoResetEvent 异步版本的 AutoResetEvent 锁 功能上和 AutoResetEvent 相同,只是将 WaitOne 替换为 WaitOneAsync 用于支持异步等待 详细请看 [C# dotnet 高性能多线程工具 AsyncAutoResetEvent 异步等待使用方法和原理](https://blog.lindexi.com/post/C-dotnet-%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B7%A5%E5%85%B7-AsyncAutoResetEvent-%E5%BC%82%E6%AD%A5%E7%AD%89%E5%BE%85%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%92%8C%E5%8E%9F%E7%90%86.html ) ### AsyncManualResetEvent 异步版本的 ManualResetEvent 锁 功能上和 ManualResetEvent 相同,只是将 WaitOne 替换为 WaitOneAsync 用于支持异步等待 ### ExecuteOnceAwaiter 支持本机内多线程调用某一确定的任务的执行,任务仅执行一次,多次调用均返回相同结果 在任务执行完成之后,可以重置任务状态,让任务再次执行 如用来作为执行 同步 这个业务的工具。也就是在 同步 这个业务执行过程中,不允许再次执行 同步 这个业务。同时只要同步过了,那么再次调用只是返回同步结果。只有在同步之后状态发生变更之后,才能再次同步 详细请看 [C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务](https://lindexi.gitee.io/post/C-dotnet-%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B7%A5%E5%85%B7-ExecuteOnceAwaiter-%E5%8F%AA%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9A%84%E4%BB%BB%E5%8A%A1.html )