1
1
using System ;
2
2
using System . Collections . Concurrent ;
3
- using System . Threading ;
3
+ using System . Diagnostics ;
4
4
using System . Threading . Tasks ;
5
5
6
6
namespace dotnetCampus . Threading
@@ -15,9 +15,8 @@ public class AsyncTaskQueue : IDisposable
15
15
/// </summary>
16
16
public AsyncTaskQueue ( )
17
17
{
18
- _autoResetEvent = new AutoResetEvent ( false ) ;
19
- _thread = new Thread ( InternalRunning ) { IsBackground = true } ;
20
- _thread . Start ( ) ;
18
+ _autoResetEvent = new AsyncAutoResetEvent ( false ) ;
19
+ InternalRunning ( ) ;
21
20
}
22
21
23
22
#region 执行
@@ -65,7 +64,7 @@ public async Task<bool> ExecuteAsync<T>(Func<Task> func)
65
64
private AwaitableTask GetExecutableTask ( Action action )
66
65
{
67
66
var awaitableTask = new AwaitableTask ( new Task ( action ) ) ;
68
- AddPenddingTaskToQueue ( awaitableTask ) ;
67
+ AddPendingTaskToQueue ( awaitableTask ) ;
69
68
return awaitableTask ;
70
69
}
71
70
@@ -78,7 +77,7 @@ private AwaitableTask GetExecutableTask(Action action)
78
77
private AwaitableTask < TResult > GetExecutableTask < TResult > ( Func < TResult > function )
79
78
{
80
79
var awaitableTask = new AwaitableTask < TResult > ( new Task < TResult > ( function ) ) ;
81
- AddPenddingTaskToQueue ( awaitableTask ) ;
80
+ AddPendingTaskToQueue ( awaitableTask ) ;
82
81
return awaitableTask ;
83
82
}
84
83
@@ -87,7 +86,7 @@ private AwaitableTask<TResult> GetExecutableTask<TResult>(Func<TResult> function
87
86
/// </summary>
88
87
/// <param name="task"></param>
89
88
/// <returns></returns>
90
- private void AddPenddingTaskToQueue ( AwaitableTask task )
89
+ private void AddPendingTaskToQueue ( AwaitableTask task )
91
90
{
92
91
//添加队列,加锁。
93
92
lock ( _queue )
@@ -102,14 +101,14 @@ private void AddPenddingTaskToQueue(AwaitableTask task)
102
101
103
102
#region 内部运行
104
103
105
- private void InternalRunning ( )
104
+ private async void InternalRunning ( )
106
105
{
107
106
while ( ! _isDisposed )
108
107
{
109
108
if ( _queue . Count == 0 )
110
109
{
111
110
//等待后续任务
112
- _autoResetEvent . WaitOne ( ) ;
111
+ await _autoResetEvent . WaitOneAsync ( ) ;
113
112
}
114
113
115
114
while ( TryGetNextTask ( out var task ) )
@@ -151,6 +150,7 @@ private bool TryGetNextTask(out AwaitableTask task)
151
150
return true ;
152
151
}
153
152
153
+ Debug . Assert ( task != null ) ;
154
154
//并发操作,设置任务不可执行
155
155
task . SetNotExecutable ( ) ;
156
156
}
@@ -182,10 +182,10 @@ private void Dispose(bool disposing)
182
182
if ( _isDisposed ) return ;
183
183
if ( disposing )
184
184
{
185
- _autoResetEvent . Dispose ( ) ;
185
+ // _autoResetEvent.Dispose();
186
186
}
187
187
188
- _thread = null ;
188
+ _queue . Clear ( ) ;
189
189
_autoResetEvent = null ;
190
190
_isDisposed = true ;
191
191
}
@@ -206,8 +206,7 @@ private void Dispose(bool disposing)
206
206
207
207
private bool _isDisposed ;
208
208
private readonly ConcurrentQueue < AwaitableTask > _queue = new ConcurrentQueue < AwaitableTask > ( ) ;
209
- private Thread _thread ;
210
- private AutoResetEvent _autoResetEvent ;
209
+ private AsyncAutoResetEvent _autoResetEvent ;
211
210
212
211
#endregion
213
212
}
0 commit comments