@@ -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
//开始执行任务
@@ -205,13 +206,30 @@ private void Dispose(bool disposing)
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
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