@@ -251,23 +251,6 @@ public async ValueTask<bool> LoadThumbnailAsync(CancellationToken ct = default)
251251 return HasThumbnail ;
252252 }
253253
254- public SearchResultItem CloneWithUrl ( Url s )
255- {
256- return new SearchResultItem ( Root , false )
257- {
258- Parent = this ,
259- Url = s ,
260- Artist = Artist ,
261- Character = Character ,
262- Description = Description ,
263- Title = Title ,
264- Site = Site ,
265- Source = Source ,
266- Time = Time ,
267- IsCloned = true ,
268- } ;
269- }
270-
271254 /*public async ValueTask<bool> ScanAsync(CancellationToken ct = default)
272255 {
273256 if (!(await AllocImageAsync(ct))) {
@@ -328,57 +311,48 @@ await Parallel.ForEachAsync(urls, ct, async (s, token) =>
328311 [ MNNW ( true , nameof ( ScannedItems ) ) ]
329312 public bool HasScannedItems => ScannedItems is { Count : > 0 } ;
330313
331- public async ValueTask < bool > ScanAsync2 ( CancellationToken ct = default )
314+ public async ValueTask < bool > ScanAsync ( CancellationToken ct = default )
332315 {
333- if ( ! ( await AllocImageAsync ( ct ) ) ) {
334- // return false;
335- }
336-
337316 if ( HasScannedItems ) {
338317 return true ;
339318 }
340319
341- await using var stream = GetStream ( ) ;
342- using var sr = new StreamReader ( stream ) ;
343- var str = await sr . ReadToEndAsync ( ct ) ;
320+ var cw = Channel . CreateUnbounded < SearchResultItem > ( ) ;
344321
345- var hp = new HtmlParser ( ) ;
346- var urls = ImageScanner . ParseImageUrlsByRegex ( str , Url ) ;
347- using var doc = await hp . ParseDocumentAsync ( str ) ;
348- var sriNews = new ConcurrentBag < SearchResultItem > ( ) ;
322+ var task = ScanAsync ( cw . Writer , s => { return CloneWithUrl ( s ) ; } , ct ) ;
349323
350- await Parallel . ForEachAsync ( urls , ct , async ( s , token ) =>
351- {
352- var sriNew = CloneWithUrl ( s ) ;
324+ while ( await cw . Reader . WaitToReadAsync ( ct ) ) {
325+ var val = await cw . Reader . ReadAsync ( ct ) ;
353326
354- // var sriNew = CloneToChildWithUrl(s);
355-
356- var allocImgOk = await sriNew . AllocImageAsync ( token ) ;
357-
358- if ( allocImgOk ) {
359- sriNews . Add ( sriNew ) ;
360- }
361- else {
362- sriNew ? . Dispose ( ) ;
363- }
364- } ) ;
365-
366-
367- // Root.Results.InsertRange(Root.Results.IndexOf(this), sriNews);
368- // ScannedItems = sriNews.ToList();
327+ ScannedItems . Add ( val ) ;
328+ }
369329
370- // var sriIdx = Results.IndexOf(sri);
371- // Results.InsertRange(sriIdx + 1, sriNews);
330+ var ok = await task ;
372331
373- // return ScannedResults.TryAdd(sri, sriNews.ToArray());
374- ScannedItems . AddRange ( sriNews ) ;
375- return true ;
332+ return ok ;
376333
377334 // return sriNews;
378335 }
379336
380337#endregion
381338
339+ public SearchResultItem CloneWithUrl ( Url s )
340+ {
341+ return new SearchResultItem ( Root , false )
342+ {
343+ Parent = this ,
344+ Url = s ,
345+ Artist = Artist ,
346+ Character = Character ,
347+ Description = Description ,
348+ Title = Title ,
349+ Site = Site ,
350+ Source = Source ,
351+ Time = Time ,
352+ IsCloned = true ,
353+ } ;
354+ }
355+
382356 public SearchResultItem CloneToChildWithUrl ( Url u )
383357 {
384358 var clone = ( MemberwiseClone ( ) as SearchResultItem ) ;
@@ -405,6 +379,7 @@ public override void Dispose()
405379 foreach ( SearchResultItem item in ScannedItems ) {
406380 item . Dispose ( ) ;
407381 }
382+
408383 ScannedItems . Clear ( ) ;
409384 }
410385
0 commit comments