Skip to content

Commit 154a789

Browse files
authored
Merge pull request #10 from dotnet-campus/t/lindexi/LulergarwhawhurboLebinawkairyeehu
支持释放队列
2 parents 0bea158 + 8534405 commit 154a789

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

AsyncWorkerCollection/AsyncQueue.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Concurrent;
1+
using System;
2+
using System.Collections.Concurrent;
23
using System.Collections.Generic;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -9,7 +10,7 @@ namespace dotnetCampus.Threading
910
/// 提供一个异步的队列。可以使用 await 关键字异步等待出队,当有元素入队的时候,等待就会完成。
1011
/// </summary>
1112
/// <typeparam name="T">存入异步队列中的元素类型。</typeparam>
12-
public class AsyncQueue<T>
13+
public class AsyncQueue<T> : IDisposable
1314
{
1415
private readonly SemaphoreSlim _semaphoreSlim;
1516
private readonly ConcurrentQueue<T> _queue;
@@ -64,7 +65,7 @@ public void EnqueueRange(IEnumerable<T> source)
6465
/// <returns>可以异步等待的队列返回的元素。</returns>
6566
public async Task<T> DequeueAsync(CancellationToken cancellationToken = default)
6667
{
67-
while (true)
68+
while (!_isDisposed)
6869
{
6970
await _semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false);
7071

@@ -73,6 +74,22 @@ public async Task<T> DequeueAsync(CancellationToken cancellationToken = default)
7374
return item;
7475
}
7576
}
77+
78+
return default;
7679
}
80+
81+
/// <summary>
82+
/// 主要用来释放锁,让 DequeueAsync 方法返回,解决因为锁让此对象内存不释放
83+
/// </summary>
84+
public void Dispose()
85+
{
86+
// 当释放的时候,将通过 _queue 的 Clear 清空内容,而通过 _semaphoreSlim 的释放让 DequeueAsync 释放锁
87+
// 此时将会在 DequeueAsync 进入 TryDequeue 方法,也许此时依然有开发者在 _queue.Clear() 之后插入元素,但是没关系,我只是需要保证调用 Dispose 之后会让 DequeueAsync 方法返回而已
88+
_isDisposed = true;
89+
_queue.Clear();
90+
_semaphoreSlim.Dispose();
91+
}
92+
93+
private bool _isDisposed;
7794
}
7895
}

AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace dotnetCampus.Threading
77
{
88
/// <summary>
9-
/// 异步任务队列
9+
/// 异步任务队列,这是重量级的方案,将会开启一个线程来做
1010
/// </summary>
1111
public class AsyncTaskQueue : IDisposable
1212
{

0 commit comments

Comments
 (0)