protected async Task <List <Rectangle> > _findSubimagesMultithreaded(DirectBitmap small, byte margin, ImageSearchingOptions opts) { var xy = MathHelper.CalculateTableForGrids(opts.Threads); var rects = this.Area.Split(xy.X, xy.Y).ToArray(); var token = new cancelToken(); DataflowNotifier <List <Rectangle> > df = null; AsyncManualResetEvent res = new AsyncManualResetEvent(false); if (opts.NumberOfResults > 0) //limit search! { df = new DataflowNotifier <List <Rectangle> >(r => { var @out = !(df.Collection.Count >= opts.NumberOfResults); if (@out == false) //has reached limit { token.Cancel(); res.Set(); } return(@out); }, true); } else { df = new DataflowNotifier <List <Rectangle> >(true); } Debugging.Restart(); //Debugging.Print("Ready to fire"); int i = 0; Task[] tasks = opts.IgnoreAlphaPixels && small.Map != null ? rects.Select(r => Pool.Run(() => _findImageAlpha(small, r, small.Map.Ranges, margin, token, opts)).AndThen(t => df.Set(t))).ToArray() : rects.Select(r => Pool.Run(() => _findImage(small, r, margin, token, opts)).AndThen(t => df.Set(t))).ToArray(); await Task.WhenAny(Task.WhenAll(tasks), res.WaitAsync()); //Debugging.Print("Has Ended"); return(df.Collection.ToArray().SelectMany(l => l).ToList()); }