@@ -43,14 +43,16 @@ class WorkPool
43
43
readonly ConcurrentQueue < Work > _workQueue ;
44
44
readonly CancellationTokenSource _tokenSource ;
45
45
readonly ModelBase _model ;
46
- readonly SemaphoreSlim _semaphore = new SemaphoreSlim ( 0 ) ;
46
+ CancellationTokenRegistration _tokenRegistration ;
47
+ volatile TaskCompletionSource < bool > _syncSource = new TaskCompletionSource < bool > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
47
48
private Task _task ;
48
49
49
50
public WorkPool ( ModelBase model )
50
51
{
51
52
_model = model ;
52
53
_workQueue = new ConcurrentQueue < Work > ( ) ;
53
54
_tokenSource = new CancellationTokenSource ( ) ;
55
+ _tokenRegistration = _tokenSource . Token . Register ( ( ) => _syncSource . TrySetCanceled ( ) ) ;
54
56
}
55
57
56
58
public void Start ( )
@@ -61,7 +63,7 @@ public void Start()
61
63
public void Enqueue ( Work work )
62
64
{
63
65
_workQueue . Enqueue ( work ) ;
64
- _semaphore . Release ( ) ;
66
+ _syncSource . TrySetResult ( true ) ;
65
67
}
66
68
67
69
async Task Loop ( )
@@ -70,7 +72,8 @@ async Task Loop()
70
72
{
71
73
try
72
74
{
73
- await _semaphore . WaitAsync ( _tokenSource . Token ) . ConfigureAwait ( false ) ;
75
+ await _syncSource . Task . ConfigureAwait ( false ) ;
76
+ _syncSource = new TaskCompletionSource < bool > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
74
77
}
75
78
catch ( TaskCanceledException )
76
79
{
@@ -87,6 +90,7 @@ async Task Loop()
87
90
public void Stop ( )
88
91
{
89
92
_tokenSource . Cancel ( ) ;
93
+ _tokenRegistration . Dispose ( ) ;
90
94
}
91
95
}
92
96
}
0 commit comments