Skip to content

Commit 5e45507

Browse files
authored
Merge pull request #35 from dotnet-campus/t/lindexi/doc
优化AsyncTaskQueue文档
2 parents dd36a5c + 8ec5de2 commit 5e45507

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

AsyncWorkerCollection/AsyncTaskQueue_/AsyncTaskQueue.cs

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace dotnetCampus.Threading
77
{
88
/// <summary>
9-
/// 异步任务队列,这是重量级的方案,将会开启一个线程来做
9+
/// 异步任务队列,将任务加入到队列里面按照顺序执行
1010
/// </summary>
1111
#if PublicAsInternal
1212
internal
@@ -31,7 +31,7 @@ public AsyncTaskQueue()
3131
/// </summary>
3232
/// <typeparam name="T">返回结果类型</typeparam>
3333
/// <param name="func">异步操作</param>
34-
/// <returns>isInvalid:异步操作是否有效(多任务时,如果设置了<see cref="AutoCancelPreviousTask"/>,只会保留最后一个任务有效);result:异步操作结果</returns>
34+
/// <returns>IsInvalid:异步操作是否有效(多任务时,如果设置了<see cref="AutoCancelPreviousTask"/>只会保留最后一个任务有效);Result:异步操作结果</returns>
3535
public async Task<(bool IsInvalid, T Result)> ExecuteAsync<T>(Func<Task<T>> func)
3636
{
3737
var task = GetExecutableTask(func);
@@ -50,6 +50,7 @@ public AsyncTaskQueue()
5050
/// <typeparam name="T"></typeparam>
5151
/// <param name="func"></param>
5252
/// <returns></returns>
53+
// ReSharper disable once UnusedTypeParameter
5354
public async Task<bool> ExecuteAsync<T>(Func<Task> func)
5455
{
5556
var task = GetExecutableTask(func);
@@ -94,7 +95,7 @@ private AwaitableTask<TResult> GetExecutableTask<TResult>(Func<TResult> function
9495
private void AddPendingTaskToQueue(AwaitableTask task)
9596
{
9697
//添加队列,加锁。
97-
lock (_queue)
98+
lock (Locker)
9899
{
99100
_queue.Enqueue(task);
100101
//开始执行任务
@@ -187,11 +188,11 @@ private void Dispose(bool disposing)
187188
if (_isDisposed) return;
188189
if (disposing)
189190
{
190-
//_autoResetEvent.Dispose();
191191
}
192192

193+
// 先调用 Clear 方法,然后调用 _autoResetEvent.Dispose 此时的任务如果还没执行的,就不会执行
193194
_queue.Clear();
194-
_autoResetEvent = null;
195+
_autoResetEvent.Dispose();
195196
_isDisposed = true;
196197
}
197198

@@ -200,18 +201,35 @@ private void Dispose(bool disposing)
200201
#region 属性及字段
201202

202203
/// <summary>
203-
/// 是否使用单线程完成任务.
204+
/// 是否使用单线程完成任务
204205
/// </summary>
205206
public bool UseSingleThread { get; set; } = true;
206207

207208
/// <summary>
208-
/// 自动取消以前的任务
209+
/// 自动取消以前的任务,此属性应该是在创建对象完成之后给定,不允许在任务执行过程中更改
209210
/// </summary>
210-
public bool AutoCancelPreviousTask { get; set; } = false;
211+
/// 设置和获取不需要加上锁,因为这是原子的,业务上也不会有开发者不断修改这个值。也就是说这个属性只有在对象创建就给定
212+
public bool AutoCancelPreviousTask
213+
{
214+
get => _autoCancelPreviousTask;
215+
set
216+
{
217+
if (_lastDoingTask != null)
218+
{
219+
// 仅用于开发时告诉开发者,在任务开始之后调用是不对的
220+
throw new InvalidOperationException($"此属性应该是在创建对象完成之后给定,不允许在任务执行过程中更改");
221+
}
222+
223+
_autoCancelPreviousTask = value;
224+
}
225+
}
211226

227+
private object Locker => _queue;
212228
private bool _isDisposed;
213229
private readonly ConcurrentQueue<AwaitableTask> _queue = new ConcurrentQueue<AwaitableTask>();
214-
private AsyncAutoResetEvent _autoResetEvent;
230+
private readonly AsyncAutoResetEvent _autoResetEvent;
231+
// ReSharper disable once RedundantDefaultMemberInitializer
232+
private bool _autoCancelPreviousTask = false;
215233

216234
#endregion
217235
}

0 commit comments

Comments
 (0)