From 5d7aef69b4ae6afac781c09a7d23f65b8c9bc646 Mon Sep 17 00:00:00 2001 From: KomiSans Date: Thu, 20 Oct 2022 08:59:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?init:.Net=206=E7=89=88=E6=9C=AC=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsyncWorkerCollection/AsyncAutoResetEvent.cs | 9 ++-- .../AsyncManualResetEvent.cs | 2 +- AsyncWorkerCollection/AsyncQueue.cs | 12 ++--- .../AsyncTaskQueue_/AsyncTaskQueue.cs | 33 ++++++++------ .../AsyncTaskQueue_/AwaitableTask.cs | 6 +-- .../AsyncTaskQueue_/AwaitableTaskTResult.cs | 2 +- .../ConcurrentQueueExtension.cs | 8 +--- .../DoubleBuffer_/DoubleBuffer.cs | 3 +- .../DoubleBufferLazyInitializeTask.cs | 45 ++++++++----------- .../DoubleBuffer_/DoubleBufferTask.cs | 12 ++--- .../DoubleBuffer_/DoubleBufferTask`T.cs | 2 +- .../DoubleBuffer_/DoubleBuffer`T.cs | 2 +- AsyncWorkerCollection/ExecuteOnceAwaiter.cs | 9 ++-- .../LimitedRunningCountTask.cs | 32 +++++-------- .../Reentrancy/KeepLastReentrancyTask.cs | 6 ++- .../Reentrancy/QueueReentrancyTask.cs | 4 +- .../Reentrancy/ReentrancyTask.cs | 4 +- 17 files changed, 87 insertions(+), 104 deletions(-) diff --git a/AsyncWorkerCollection/AsyncAutoResetEvent.cs b/AsyncWorkerCollection/AsyncAutoResetEvent.cs index b2015b2..a8ec7cf 100644 --- a/AsyncWorkerCollection/AsyncAutoResetEvent.cs +++ b/AsyncWorkerCollection/AsyncAutoResetEvent.cs @@ -14,7 +14,7 @@ namespace dotnetCampus.Threading #else public #endif - class AsyncAutoResetEvent : IDisposable + class AsyncAutoResetEvent : IDisposable { /// /// 提供一个信号初始值,确定是否有信号 @@ -72,7 +72,7 @@ public Task WaitOneAsync() /// public void Set() { - TaskCompletionSource? releaseSource = null; + TaskCompletionSource? releaseSource = default; bool result; lock (_locker) { @@ -125,10 +125,9 @@ public void Dispose() private bool _isDisposed; - private readonly object _locker = new object(); + private readonly object _locker = new(); - private readonly Queue> _waitQueue = - new Queue>(); + private readonly Queue> _waitQueue = new(); /// /// 用于在没有任何等待时让下一次等待通过 diff --git a/AsyncWorkerCollection/AsyncManualResetEvent.cs b/AsyncWorkerCollection/AsyncManualResetEvent.cs index 668a42c..20120da 100644 --- a/AsyncWorkerCollection/AsyncManualResetEvent.cs +++ b/AsyncWorkerCollection/AsyncManualResetEvent.cs @@ -11,7 +11,7 @@ namespace dotnetCampus.Threading #else public #endif - class AsyncManualResetEvent + class AsyncManualResetEvent { /// /// 提供一个信号初始值,确定是否有信号 diff --git a/AsyncWorkerCollection/AsyncQueue.cs b/AsyncWorkerCollection/AsyncQueue.cs index 7e257e1..7248c59 100644 --- a/AsyncWorkerCollection/AsyncQueue.cs +++ b/AsyncWorkerCollection/AsyncQueue.cs @@ -1,10 +1,10 @@ #nullable enable + using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; - #if !NETCOREAPP using ValueTask = System.Threading.Tasks.Task; #endif @@ -20,7 +20,7 @@ namespace dotnetCampus.Threading #else public #endif - class AsyncQueue : IDisposable, IAsyncDisposable + class AsyncQueue : IDisposable, IAsyncDisposable { private readonly SemaphoreSlim _semaphoreSlim; private readonly ConcurrentQueue _queue; @@ -119,7 +119,7 @@ public async Task DequeueAsync(CancellationToken cancellationToken = default) /// public async ValueTask WaitForCurrentFinished() { - if (_queue.Count == 0) + if (_queue.Count is 0) { return; } @@ -128,7 +128,7 @@ public async ValueTask WaitForCurrentFinished() // 有线程执行事件触发,刚好此时在创建 CurrentFinishedTask 对象 // 此时需要重新判断是否存在任务 - if (_queue.Count == 0) + if (_queue.Count is 0) { return; } @@ -155,6 +155,7 @@ public void Dispose() // 释放 DequeueAsync 方法,释放次数为 DequeueAsync 在调用的次数 _semaphoreSlim.Release(_dequeueAsyncEnterCount); } + _semaphoreSlim.Dispose(); } @@ -221,8 +222,7 @@ public async ValueTask WaitForCurrentFinished() await _currentFinishedTaskCompletionSource.Task.ConfigureAwait(false); } - private readonly TaskCompletionSource _currentFinishedTaskCompletionSource = - new TaskCompletionSource(); + private readonly TaskCompletionSource _currentFinishedTaskCompletionSource = new(); private readonly AsyncQueue _asyncQueue; diff --git a/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs b/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs index 0f059eb..336575e 100644 --- a/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs +++ b/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs @@ -13,7 +13,7 @@ namespace dotnetCampus.Threading #else public #endif - class AsyncTaskQueue : IDisposable + class AsyncTaskQueue : IDisposable { /// /// 异步任务队列 @@ -160,16 +160,18 @@ private async void InternalRunning() //如已从队列中删除 if (!task.Executable) continue; //添加是否已释放的判断 - if (!_isDisposing) + if (_isDisposing) { - if (UseSingleThread) - { - task.RunSynchronously(); - } - else - { - task.Start(); - } + continue; + } + + if (UseSingleThread) + { + task.RunSynchronously(); + } + else + { + task.Start(); } } } @@ -182,8 +184,8 @@ private async void InternalRunning() private bool TryGetNextTask(out AwaitableTask task) { - task = null; - while (_queue.Count > 0) + task = default; + while (_queue.Count is 0) { //获取并从队列中移除任务 if (_queue.TryDequeue(out task) && (!AutoCancelPreviousTask || _queue.Count == 0)) @@ -199,7 +201,7 @@ private bool TryGetNextTask(out AwaitableTask task) task.SetNotExecutable(); } - return false; + return default; } #endregion @@ -228,7 +230,9 @@ private void Dispose(bool disposing) lock (Locker) { if (_isDisposed) return; + _isDisposing = true; + if (disposing) { } @@ -271,8 +275,9 @@ public bool AutoCancelPreviousTask private object Locker => _queue; private bool _isDisposed; private bool _isDisposing; - private readonly ConcurrentQueue _queue = new ConcurrentQueue(); + private readonly ConcurrentQueue _queue = new(); private readonly AsyncAutoResetEvent _autoResetEvent; + // ReSharper disable once RedundantDefaultMemberInitializer private bool _autoCancelPreviousTask = false; diff --git a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs index 9fad40a..08553df 100644 --- a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs +++ b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs @@ -12,7 +12,7 @@ namespace dotnetCampus.Threading #else public #endif - class AwaitableTask + class AwaitableTask { /// /// 获取任务是否为不可执行状态 @@ -30,7 +30,7 @@ class AwaitableTask /// public void SetNotExecutable() { - Executable = false; + Executable = default; } /// @@ -38,7 +38,7 @@ public void SetNotExecutable() /// public void MarkTaskInvalid() { - IsValid = false; + IsValid = default; } #region Task diff --git a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTaskTResult.cs b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTaskTResult.cs index 830cce4..2ad4663 100644 --- a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTaskTResult.cs +++ b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTaskTResult.cs @@ -13,7 +13,7 @@ namespace dotnetCampus.Threading #else public #endif - class AwaitableTask : AwaitableTask + class AwaitableTask : AwaitableTask { /// /// 初始化可等待的任务 diff --git a/AsyncWorkerCollection/ConcurrentQueueExtension.cs b/AsyncWorkerCollection/ConcurrentQueueExtension.cs index 9fee45c..e0c2d61 100644 --- a/AsyncWorkerCollection/ConcurrentQueueExtension.cs +++ b/AsyncWorkerCollection/ConcurrentQueueExtension.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Concurrent; namespace dotnetCampus.Threading { @@ -14,7 +9,6 @@ public static void Clear(this ConcurrentQueue queue) { while (queue.TryDequeue(out _)) { - } } } diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs index 48674e9..fd44edd 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs @@ -15,7 +15,7 @@ namespace dotnetCampus.Threading #else public #endif - class DoubleBuffer where T : class, ICollection + class DoubleBuffer where T : class, ICollection { /// /// 创建双缓存 @@ -109,6 +109,7 @@ internal bool GetIsEmpty() /// 用于给其他类型的同步使用的对象 /// internal object SyncObject => _lock; + private readonly object _lock = new object(); private T CurrentList { set; get; } diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferLazyInitializeTask.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferLazyInitializeTask.cs index cff96bf..eee47da 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferLazyInitializeTask.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferLazyInitializeTask.cs @@ -20,7 +20,7 @@ namespace dotnetCampus.Threading #else public #endif - class DoubleBufferLazyInitializeTask + class DoubleBufferLazyInitializeTask { /// /// 初始化可等待初始化之后才执行实际任务的双缓存工具 @@ -48,16 +48,9 @@ public void OnInitialized() lock (Locker) { - if (_waitForInitializationTask != null) - { - // 如果不是空 - // 那么设置任务完成 - _waitForInitializationTask.SetResult(true); - } - else - { - // 如果是空,那么 DoInner 还没进入,此时啥都不需要做 - } + // 如果不是空 + // 那么设置任务完成 + _waitForInitializationTask?.SetResult(true); } } @@ -91,15 +84,15 @@ public void AddTask(T data) private async Task DoInner(List dataList) { -// 根据 DoubleBufferTask 的设计,这个方法只有一个线程进入 -FirstCheckInitialized: // 标签:第一个判断初始化方法 + // 根据 DoubleBufferTask 的设计,这个方法只有一个线程进入 + FirstCheckInitialized: // 标签:第一个判断初始化方法 if (!_isInitialized) { // 还没有初始化,等待一下 // 如果此时还没有任务可以等待,那么创建一下任务 lock (Locker) { -SecondCheckInitialized: // 标签:第二个判断初始化方法 + SecondCheckInitialized: // 标签:第二个判断初始化方法 if (!_isInitialized) { // 此时的值一定是空 @@ -112,21 +105,19 @@ private async Task DoInner(List dataList) { await _waitForInitializationTask!.Task.ConfigureAwait(false); } - else - { - // 此时初始化方法被调用,因此不需要再调用等待 - // 如果先进入 FirstCheckInitialized 标签的第一个判断初始化方法,此时 OnInitialized 没有被调用 - // 因此进入分支 - // 如果刚好此时 OnInitialized 方法进入,同时设置了 _isInitialized 是 true 值 - // 如果此时的 OnInitialized 方法比 DoInner 先获得锁,那么将判断 _waitForInitializationTask 是空,啥都不做 - // 然后 DoInner 在等待 OnInitialized 的 Locker 锁,进入锁之后,先通过 SecondCheckInitialized 标签的第二个判断初始化方法 - // 这个判断是线程安全的,因此如果是 OnInitialized 已进入同时获取锁,那么此时在等待 Locker 锁之后一定拿到新的值 - // 如果是 DoInner 先获得锁,那么此时也许 _isInitialized 不靠谱,但其实不依赖 _isInitialized 靠谱,因此 _isInitialized 只有一个状态,就是从 false 到 true 的值 - // 此时如果判断 _isInitialized 是 true 的值,也就不需要再创建一个任务用来等待了 - // 也就会最终进入此分支 - } + // 此时初始化方法被调用,因此不需要再调用等待 + // 如果先进入 FirstCheckInitialized 标签的第一个判断初始化方法,此时 OnInitialized 没有被调用 + // 因此进入分支 + // 如果刚好此时 OnInitialized 方法进入,同时设置了 _isInitialized 是 true 值 + // 如果此时的 OnInitialized 方法比 DoInner 先获得锁,那么将判断 _waitForInitializationTask 是空,啥都不做 + // 然后 DoInner 在等待 OnInitialized 的 Locker 锁,进入锁之后,先通过 SecondCheckInitialized 标签的第二个判断初始化方法 + // 这个判断是线程安全的,因此如果是 OnInitialized 已进入同时获取锁,那么此时在等待 Locker 锁之后一定拿到新的值 + // 如果是 DoInner 先获得锁,那么此时也许 _isInitialized 不靠谱,但其实不依赖 _isInitialized 靠谱,因此 _isInitialized 只有一个状态,就是从 false 到 true 的值 + // 此时如果判断 _isInitialized 是 true 的值,也就不需要再创建一个任务用来等待了 + // 也就会最终进入此分支 // 只需要等待一次,然后可以释放内存 + _waitForInitializationTask = null; } diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs index 8862d2a..dd7b7b6 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs @@ -18,7 +18,7 @@ namespace dotnetCampus.Threading #else public #endif - class DoubleBufferTask : IAsyncDisposable + class DoubleBufferTask : IAsyncDisposable where T : class, ICollection { /// @@ -74,12 +74,14 @@ private async void DoInner() lock (Locker) { - if (DoubleBuffer.GetIsEmpty()) + if (!DoubleBuffer.GetIsEmpty()) { - _isDoing = false; - Finished?.Invoke(this, EventArgs.Empty); - break; + continue; } + + _isDoing = false; + Finished?.Invoke(this, EventArgs.Empty); + break; } } } diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask`T.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask`T.cs index 2ea9d27..b434af0 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask`T.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask`T.cs @@ -14,7 +14,7 @@ namespace dotnetCampus.Threading #else public #endif - class DoubleBufferTask : DoubleBufferTask, T> + class DoubleBufferTask : DoubleBufferTask, T> { /// /// 创建双缓存任务,执行任务的方法放在 方法 diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer`T.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer`T.cs index 1990949..74867ac 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer`T.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer`T.cs @@ -11,7 +11,7 @@ namespace dotnetCampus.Threading #else public #endif - class DoubleBuffer : DoubleBuffer, T> + class DoubleBuffer : DoubleBuffer, T> { /// /// 创建使用 的双缓存 diff --git a/AsyncWorkerCollection/ExecuteOnceAwaiter.cs b/AsyncWorkerCollection/ExecuteOnceAwaiter.cs index 8d83631..e10281f 100644 --- a/AsyncWorkerCollection/ExecuteOnceAwaiter.cs +++ b/AsyncWorkerCollection/ExecuteOnceAwaiter.cs @@ -13,7 +13,7 @@ namespace dotnetCampus.Threading #else public #endif - class ExecuteOnceAwaiter + class ExecuteOnceAwaiter { /// /// 创建只执行一次的等待,调用 时,无论调用多少次,只会执行 一次 @@ -34,7 +34,7 @@ public Task ExecuteAsync() { lock (_locker) { - if (_executionResult != null) + if (_executionResult is not null) { return _executionResult; } @@ -53,14 +53,15 @@ public void ResetWhileCompleted() { if (_executionResult?.IsCompleted is true) { - _executionResult = null; + _executionResult = default; } } } - private readonly object _locker = new object(); + private readonly object _locker = new(); private readonly Func> _asyncAction; + private Task _executionResult; } } diff --git a/AsyncWorkerCollection/LimitedRunningCountTask.cs b/AsyncWorkerCollection/LimitedRunningCountTask.cs index b348d26..e6ee980 100644 --- a/AsyncWorkerCollection/LimitedRunningCountTask.cs +++ b/AsyncWorkerCollection/LimitedRunningCountTask.cs @@ -87,9 +87,9 @@ public async ValueTask AddAsync(Task task) /// 等待空闲 /// /// - public async ValueTask WaitForFree() + private async ValueTask WaitForFree() { - if (WaitForFreeTask == null) + if (WaitForFreeTask is null) { return; } @@ -133,7 +133,7 @@ private TaskCompletionSource? WaitForFreeTask } } - private List Buffer { get; } = new List(); + private List Buffer { get; } = new(); private object Locker => Buffer; @@ -148,18 +148,11 @@ private TaskCompletionSource? WaitForFreeTask private async void RunningInner() { // ReSharper disable once InconsistentlySynchronizedField - if (_isRunning) - { - return; - } + if (_isRunning) return; lock (Locker) { - if (_isRunning) - { - return; - } - + if (_isRunning) return; _isRunning = true; } @@ -217,16 +210,11 @@ private async void RunningInner() void SetWaitForFreeTask() { - if (runningTaskList.Count > MaxRunningCount) - { - if (WaitForFreeTask?.Task.IsCompleted is false) - { - } - else - { - WaitForFreeTask = new TaskCompletionSource(); - } - } + if (runningTaskList.Count <= MaxRunningCount) return; + + if (WaitForFreeTask?.Task.IsCompleted is false) return; + + WaitForFreeTask = new TaskCompletionSource(); } } } diff --git a/AsyncWorkerCollection/Reentrancy/KeepLastReentrancyTask.cs b/AsyncWorkerCollection/Reentrancy/KeepLastReentrancyTask.cs index 07c3a9f..155e153 100644 --- a/AsyncWorkerCollection/Reentrancy/KeepLastReentrancyTask.cs +++ b/AsyncWorkerCollection/Reentrancy/KeepLastReentrancyTask.cs @@ -22,7 +22,7 @@ namespace dotnetCampus.Threading.Reentrancy #else public #endif - sealed class KeepLastReentrancyTask : ReentrancyTask + sealed class KeepLastReentrancyTask : ReentrancyTask { /// /// 用于原子操作判断当前是否正在执行队列中的可重入任务。 @@ -192,8 +192,10 @@ internal async Task RunAsync() var task = _task(); if (task is null) { - throw new InvalidOperationException("在指定 KeepLastReentrancyTask 的任务时,方法内不允许返回 null。请至少返回 Task.FromResult(null)。"); + throw new InvalidOperationException( + "在指定 KeepLastReentrancyTask 的任务时,方法内不允许返回 null。请至少返回 Task.FromResult(null)。"); } + var result = await task.ConfigureAwait(_configureAwait); _taskSource.SetResult(result); Result = result; diff --git a/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs b/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs index 6a4e4c5..621f55d 100644 --- a/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs +++ b/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs @@ -21,7 +21,7 @@ namespace dotnetCampus.Threading.Reentrancy #else public #endif - sealed class QueueReentrancyTask : ReentrancyTask + sealed class QueueReentrancyTask : ReentrancyTask { /// /// 用于原子操作判断当前是否正在执行队列中的可重入任务。 @@ -34,7 +34,7 @@ sealed class QueueReentrancyTask : ReentrancyTask 中值为 0 时所指的不确定情况。 /// 不能使用一个锁来同步所有情况是因为在锁中使用 async/await 是不安全的,因此避免在锁中执行异步任务;我们使用原子操作来判断异步任务的执行条件。 /// - private readonly object _locker = new object(); + private readonly object _locker = new(); /// /// 使用一个并发队列来表示目前已加入到队列中的全部可重入任务。 diff --git a/AsyncWorkerCollection/Reentrancy/ReentrancyTask.cs b/AsyncWorkerCollection/Reentrancy/ReentrancyTask.cs index 675ca32..940b885 100644 --- a/AsyncWorkerCollection/Reentrancy/ReentrancyTask.cs +++ b/AsyncWorkerCollection/Reentrancy/ReentrancyTask.cs @@ -19,12 +19,12 @@ namespace dotnetCampus.Threading.Reentrancy #else public #endif - abstract class ReentrancyTask + abstract class ReentrancyTask { /// /// 在派生类中执行重入任务的时候,从此处获取需要执行的可重入异步任务。 /// - protected Func> WorkingTask { get; } + private Func> WorkingTask { get; } /// /// 初始化可重入任务的公共基类。 From 3ea47021bdbe84b061334aed2c81f04e571cecf9 Mon Sep 17 00:00:00 2001 From: KomiSans Date: Thu, 20 Oct 2022 19:14:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?drawback:=E6=92=A4=E5=9B=9E=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsyncWorkerCollection/AsyncAutoResetEvent.cs | 4 ++-- AsyncWorkerCollection/AsyncQueue.cs | 3 ++- .../AsyncTaskQueue_/AsyncTaskQueue.cs | 8 ++++---- .../AsyncTaskQueue_/AwaitableTask.cs | 4 ++-- AsyncWorkerCollection/AsyncWorkerCollection.csproj | 1 + AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs | 12 ++---------- .../DoubleBuffer_/DoubleBufferTask.cs | 2 +- AsyncWorkerCollection/ExecuteOnceAwaiter.cs | 4 ++-- AsyncWorkerCollection/LimitedRunningCountTask.cs | 2 +- .../Reentrancy/QueueReentrancyTask.cs | 2 +- 10 files changed, 18 insertions(+), 24 deletions(-) diff --git a/AsyncWorkerCollection/AsyncAutoResetEvent.cs b/AsyncWorkerCollection/AsyncAutoResetEvent.cs index a8ec7cf..5b47e99 100644 --- a/AsyncWorkerCollection/AsyncAutoResetEvent.cs +++ b/AsyncWorkerCollection/AsyncAutoResetEvent.cs @@ -125,9 +125,9 @@ public void Dispose() private bool _isDisposed; - private readonly object _locker = new(); + private readonly object _locker = new object(); - private readonly Queue> _waitQueue = new(); + private readonly Queue> _waitQueue = new Queue>(); /// /// 用于在没有任何等待时让下一次等待通过 diff --git a/AsyncWorkerCollection/AsyncQueue.cs b/AsyncWorkerCollection/AsyncQueue.cs index 7248c59..a5aa57d 100644 --- a/AsyncWorkerCollection/AsyncQueue.cs +++ b/AsyncWorkerCollection/AsyncQueue.cs @@ -222,7 +222,8 @@ public async ValueTask WaitForCurrentFinished() await _currentFinishedTaskCompletionSource.Task.ConfigureAwait(false); } - private readonly TaskCompletionSource _currentFinishedTaskCompletionSource = new(); + private readonly TaskCompletionSource _currentFinishedTaskCompletionSource = + new TaskCompletionSource(); private readonly AsyncQueue _asyncQueue; diff --git a/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs b/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs index 336575e..3150c0d 100644 --- a/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs +++ b/AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs @@ -184,8 +184,8 @@ private async void InternalRunning() private bool TryGetNextTask(out AwaitableTask task) { - task = default; - while (_queue.Count is 0) + task = null; + while (_queue.Count > 0) { //获取并从队列中移除任务 if (_queue.TryDequeue(out task) && (!AutoCancelPreviousTask || _queue.Count == 0)) @@ -201,7 +201,7 @@ private bool TryGetNextTask(out AwaitableTask task) task.SetNotExecutable(); } - return default; + return false; } #endregion @@ -275,7 +275,7 @@ public bool AutoCancelPreviousTask private object Locker => _queue; private bool _isDisposed; private bool _isDisposing; - private readonly ConcurrentQueue _queue = new(); + private readonly ConcurrentQueue _queue = new ConcurrentQueue(); private readonly AsyncAutoResetEvent _autoResetEvent; // ReSharper disable once RedundantDefaultMemberInitializer diff --git a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs index 08553df..10ae9b7 100644 --- a/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs +++ b/AsyncWorkerCollection/AsyncTaskQueue_/AwaitableTask.cs @@ -30,7 +30,7 @@ class AwaitableTask /// public void SetNotExecutable() { - Executable = default; + Executable = false; } /// @@ -38,7 +38,7 @@ public void SetNotExecutable() /// public void MarkTaskInvalid() { - IsValid = default; + IsValid = false; } #region Task diff --git a/AsyncWorkerCollection/AsyncWorkerCollection.csproj b/AsyncWorkerCollection/AsyncWorkerCollection.csproj index b6ccc94..dad11d4 100644 --- a/AsyncWorkerCollection/AsyncWorkerCollection.csproj +++ b/AsyncWorkerCollection/AsyncWorkerCollection.csproj @@ -6,6 +6,7 @@ true true dotnetCampus.AsyncWorkerCollection + 8 diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs index fd44edd..1f33701 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBuffer.cs @@ -50,16 +50,8 @@ public T SwitchBuffer() { lock (_lock) { - if (ReferenceEquals(CurrentList, AList)) - { - CurrentList = BList; - return AList; - } - else - { - CurrentList = AList; - return BList; - } + CurrentList = ReferenceEquals(CurrentList, AList) ? AList : BList; + return ReferenceEquals(CurrentList, AList) ? BList : AList; } } diff --git a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs index dd7b7b6..ccd2ec7 100644 --- a/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs +++ b/AsyncWorkerCollection/DoubleBuffer_/DoubleBufferTask.cs @@ -50,7 +50,7 @@ public void AddTask(TU t) if (isSetFinish == 1) { // 被设置完成了,业务上就不应该再次给任何的数据内容 - throw new InvalidOperationException($"The DoubleBufferTask has been set finish."); + throw new InvalidOperationException("The DoubleBufferTask has been set finish."); } DoubleBuffer.Add(t); diff --git a/AsyncWorkerCollection/ExecuteOnceAwaiter.cs b/AsyncWorkerCollection/ExecuteOnceAwaiter.cs index e10281f..443bb30 100644 --- a/AsyncWorkerCollection/ExecuteOnceAwaiter.cs +++ b/AsyncWorkerCollection/ExecuteOnceAwaiter.cs @@ -34,7 +34,7 @@ public Task ExecuteAsync() { lock (_locker) { - if (_executionResult is not null) + if (_executionResult != null) { return _executionResult; } @@ -58,7 +58,7 @@ public void ResetWhileCompleted() } } - private readonly object _locker = new(); + private readonly object _locker = new object(); private readonly Func> _asyncAction; diff --git a/AsyncWorkerCollection/LimitedRunningCountTask.cs b/AsyncWorkerCollection/LimitedRunningCountTask.cs index e6ee980..0c1c91f 100644 --- a/AsyncWorkerCollection/LimitedRunningCountTask.cs +++ b/AsyncWorkerCollection/LimitedRunningCountTask.cs @@ -133,7 +133,7 @@ private TaskCompletionSource? WaitForFreeTask } } - private List Buffer { get; } = new(); + private List Buffer { get; } = new List(); private object Locker => Buffer; diff --git a/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs b/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs index 621f55d..31c1b01 100644 --- a/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs +++ b/AsyncWorkerCollection/Reentrancy/QueueReentrancyTask.cs @@ -34,7 +34,7 @@ sealed class QueueReentrancyTask : ReentrancyTask 中值为 0 时所指的不确定情况。 /// 不能使用一个锁来同步所有情况是因为在锁中使用 async/await 是不安全的,因此避免在锁中执行异步任务;我们使用原子操作来判断异步任务的执行条件。 /// - private readonly object _locker = new(); + private readonly object _locker = new object(); /// /// 使用一个并发队列来表示目前已加入到队列中的全部可重入任务。