@@ -42,7 +42,7 @@ public SearchClient(SearchConfig config)
4242 DetailedResults = new List < ImageResult > ( ) ;
4343 ContinueTasks = new List < Task > ( ) ;
4444
45- DirectResultsWaitHandle = new AutoResetEvent ( false ) ;
45+ DirectResultsWaitHandle = new ( ) ;
4646
4747 Reload ( ) ;
4848
@@ -90,7 +90,7 @@ public SearchClient(SearchConfig config)
9090 /// <summary>
9191 /// Number of pending results
9292 /// </summary>
93- public int PendingCount { get ; private set ; }
93+ public int PendingCount => Tasks . Count ;
9494
9595 public int CompleteCount => AllResults . Count ;
9696
@@ -100,7 +100,7 @@ public SearchClient(SearchConfig config)
100100
101101 public List < Task > ContinueTasks { get ; }
102102
103- public WaitHandle DirectResultsWaitHandle { get ; private set ; }
103+ public TaskCompletionSource DirectResultsWaitHandle { get ; private set ; }
104104
105105
106106 /// <summary>
@@ -130,13 +130,12 @@ public void Reset()
130130 FilteredResults . Clear ( ) ;
131131 DetailedResults . Clear ( ) ;
132132 ContinueTasks . Clear ( ) ;
133- PendingCount = 0 ;
133+
134134
135135 IsComplete = false ;
136136 IsContinueComplete = false ;
137137
138- DirectResultsWaitHandle = new AutoResetEvent ( false ) ;
139-
138+ DirectResultsWaitHandle = new ( ) ;
140139 Reload ( ) ;
141140 }
142141
@@ -159,8 +158,6 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
159158 return task ;
160159 } ) ) ;
161160
162- PendingCount = Tasks . Count ;
163-
164161
165162 while ( ! IsComplete && ! cts . Value . IsCancellationRequested ) {
166163 var finished = await Task . WhenAny ( Tasks ) ;
@@ -170,10 +167,9 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
170167
171168 ContinueTasks . Add ( task ) ;
172169
173- SearchResult value = await finished ;
170+ SearchResult value = finished . Result ;
174171
175172 Tasks . Remove ( finished ) ;
176- PendingCount = Tasks . Count ;
177173
178174 bool ? isFiltered ;
179175 bool isPriority = Config . PriorityEngines . HasFlag ( value . Engine . EngineOption ) ;
@@ -194,6 +190,7 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
194190
195191 if ( value . IsNonPrimitive ) {
196192 Results . Add ( value ) ;
193+ DetailedResults . Add ( value . PrimaryResult ) ;
197194 isFiltered = false ;
198195 }
199196 else {
@@ -206,11 +203,6 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
206203 isFiltered = null ;
207204 }
208205
209-
210- if ( DetailPredicate ( value ) ) {
211- DetailedResults . Add ( value . PrimaryResult ) ;
212- }
213-
214206 //
215207
216208 // Call event
@@ -229,7 +221,7 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
229221
230222 /* 2nd pass */
231223
232- DetailedResults . AddRange ( ApplyPredicateFilter ( Results , DetailPredicate ) ) ;
224+ // DetailedResults.AddRange(ApplyPredicateFilter(Results, v => v.IsNonPrimitive ));
233225
234226 var args = new SearchCompletedEventArgs { } ;
235227
@@ -253,17 +245,14 @@ public async Task RunContinueAsync(CancellationToken? c = null)
253245
254246 }
255247
256- if ( ! DirectResultsWaitHandle . SafeWaitHandle . IsInvalid || ! DirectResultsWaitHandle . SafeWaitHandle . IsClosed ) {
257- ( ( AutoResetEvent ) DirectResultsWaitHandle ) . Set ( ) ;
258- }
259248 }
260249
261250
262251 private void GetResultContinueCallback ( Task < SearchResult > task , object state )
263252 {
264253 var value = task . Result ;
265254
266- if ( ! value . IsSuccessful || ! value . IsNonPrimitive || value . Scanned ) {
255+ if ( ! value . IsStatusSuccessful || ! value . IsNonPrimitive || value . Scanned ) {
267256 return ;
268257 }
269258
@@ -274,20 +263,19 @@ private void GetResultContinueCallback(Task<SearchResult> task, object state)
274263 DirectResults . AddRange ( result ) ;
275264
276265 value . Scanned = true ;
277- var autoResetEvent = ( ( AutoResetEvent ) DirectResultsWaitHandle ) ;
278266
279267 if ( DirectResults . Count > 0 /*||
280268 !DirectResultsWaitHandle.SafeWaitHandle.IsClosed*/ /*|| ContinueTasks.Count==1*/ ) {
281269
282- if ( ! DirectResultsWaitHandle . SafeWaitHandle . IsClosed ) {
270+ if ( DirectResultsWaitHandle . TrySetResult ( ) ) {
283271 Debug . WriteLine ( "wait handle set" ) ;
284- autoResetEvent . Set ( ) ;
272+
285273
286274 }
287275
288276 }
289277
290- DirectResultCompleted ? . Invoke ( null , EventArgs . Empty ) ;
278+ ContinueCompleted ? . Invoke ( null , EventArgs . Empty ) ;
291279
292280 // if (result.Any()) { }
293281
@@ -345,7 +333,7 @@ public List<SearchResult> MaximizeResults<T>(Func<SearchResult, T> property)
345333
346334 var res = Results . OrderByDescending ( property ) . ToList ( ) ;
347335
348- res . RemoveAll ( r => ! DetailPredicate ( r ) ) ;
336+ res . RemoveAll ( r => ! r . IsNonPrimitive ) ;
349337
350338 return res ;
351339 }
@@ -367,9 +355,9 @@ public static BaseSearchEngine[] GetAllSearchEngines()
367355 }
368356
369357 /// <summary>
370- /// Fires when a result has been updated with new information
358+ /// Fires when <see cref="GetResultContinueCallback"/> returns
371359 /// </summary>
372- public event EventHandler DirectResultCompleted ;
360+ public event EventHandler ContinueCompleted ;
373361
374362 /// <summary>
375363 /// Fires when a result is returned (<see cref="RunSearchAsync" />).
@@ -382,24 +370,19 @@ public static BaseSearchEngine[] GetAllSearchEngines()
382370 public event EventHandler < SearchCompletedEventArgs > SearchCompleted ;
383371
384372
385- private static readonly Predicate < SearchResult > DetailPredicate = r => r . IsNonPrimitive ;
386-
387- private static readonly SmartImageException SearchException = new ( "Search must be completed" ) ;
373+ private static readonly SmartImageException SearchException = new ( "Search not complete" ) ;
388374
389375
390376 public void Dispose ( )
391377 {
392- foreach ( ImageResult result in DirectResults ) {
378+ /* foreach (ImageResult result in DirectResults) {
393379 result.Dispose();
394- }
380+ }*/
395381
396382 foreach ( SearchResult result in AllResults ) {
397383 result . Dispose ( ) ;
398384 }
399385
400- if ( ! DirectResultsWaitHandle . SafeWaitHandle . IsClosed ) {
401- DirectResultsWaitHandle . Dispose ( ) ;
402- }
403386 }
404387}
405388
0 commit comments