6
6
namespace dotnetCampus . Threading
7
7
{
8
8
/// <summary>
9
- /// 异步任务队列,这是重量级的方案,将会开启一个线程来做
9
+ /// 异步任务队列,将任务加入到队列里面按照顺序执行
10
10
/// </summary>
11
11
#if PublicAsInternal
12
12
internal
@@ -31,7 +31,7 @@ public AsyncTaskQueue()
31
31
/// </summary>
32
32
/// <typeparam name="T">返回结果类型</typeparam>
33
33
/// <param name="func">异步操作</param>
34
- /// <returns>isInvalid :异步操作是否有效(多任务时,如果设置了<see cref="AutoCancelPreviousTask"/>, 只会保留最后一个任务有效);result :异步操作结果</returns>
34
+ /// <returns>IsInvalid :异步操作是否有效(多任务时,如果设置了<see cref="AutoCancelPreviousTask"/>, 只会保留最后一个任务有效);Result :异步操作结果</returns>
35
35
public async Task < ( bool IsInvalid , T Result ) > ExecuteAsync < T > ( Func < Task < T > > func )
36
36
{
37
37
var task = GetExecutableTask ( func ) ;
@@ -50,6 +50,7 @@ public AsyncTaskQueue()
50
50
/// <typeparam name="T"></typeparam>
51
51
/// <param name="func"></param>
52
52
/// <returns></returns>
53
+ // ReSharper disable once UnusedTypeParameter
53
54
public async Task < bool > ExecuteAsync < T > ( Func < Task > func )
54
55
{
55
56
var task = GetExecutableTask ( func ) ;
@@ -94,7 +95,7 @@ private AwaitableTask<TResult> GetExecutableTask<TResult>(Func<TResult> function
94
95
private void AddPendingTaskToQueue ( AwaitableTask task )
95
96
{
96
97
//添加队列,加锁。
97
- lock ( _queue )
98
+ lock ( Locker )
98
99
{
99
100
_queue . Enqueue ( task ) ;
100
101
//开始执行任务
@@ -187,11 +188,11 @@ private void Dispose(bool disposing)
187
188
if ( _isDisposed ) return ;
188
189
if ( disposing )
189
190
{
190
- //_autoResetEvent.Dispose();
191
191
}
192
192
193
+ // 先调用 Clear 方法,然后调用 _autoResetEvent.Dispose 此时的任务如果还没执行的,就不会执行
193
194
_queue . Clear ( ) ;
194
- _autoResetEvent = null ;
195
+ _autoResetEvent . Dispose ( ) ;
195
196
_isDisposed = true ;
196
197
}
197
198
@@ -200,18 +201,35 @@ private void Dispose(bool disposing)
200
201
#region 属性及字段
201
202
202
203
/// <summary>
203
- /// 是否使用单线程完成任务.
204
+ /// 是否使用单线程完成任务
204
205
/// </summary>
205
206
public bool UseSingleThread { get ; set ; } = true ;
206
207
207
208
/// <summary>
208
- /// 自动取消以前的任务。
209
+ /// 自动取消以前的任务,此属性应该是在创建对象完成之后给定,不允许在任务执行过程中更改
209
210
/// </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
+ }
211
226
227
+ private object Locker => _queue ;
212
228
private bool _isDisposed ;
213
229
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 ;
215
233
216
234
#endregion
217
235
}
0 commit comments