public void Doit(IEnumerable <string> fileList, int cores = 2) { //_db = db; arg = new ScanState(); source = new CancellationTokenSource(); token = source.Token; _empty = new ManualResetEvent(false); CORES = cores; _logger.LogInformation("Engine start."); arg.Start = DateTime.UtcNow; arg.Total = fileList.Count(); s2decode.DEBUG = DSdata.Config.Debug; s2decode.LoadEngine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileList.Count()); _jobs_decode = new BlockingCollection <string>(); foreach (var ent in fileList) { try { _jobs_decode.Add(ent); } catch (OperationCanceledException) { break; } } for (int i = 0; i < CORES; i++) { Thread thread = new Thread(OnHandlerStart) { IsBackground = true }; //Mark 'false' if you want to prevent program exit until jobs finish thread.Start(); } Task tsscan = Task.Factory.StartNew(() => { int i = 0; while (!_empty.WaitOne(1000)) { i++; arg.Done = s2decode.DONE; arg.Failed = s2decode.FAILED; arg.Threads = s2decode.THREADS; while (s2decode.FailedDSReplays.Any()) { string frep = null; if (s2decode.FailedDSReplays.TryTake(out frep)) { arg.FailedReplays.Add(frep); } } arg.FailedReplays.AddRange(s2decode.FailedDSReplays); if (arg.Running == false && arg.DbDone + arg.Failed >= arg.Total) { break; } else if (arg.Threads == 0 && arg.Done >= arg.Total) { arg.Running = false; } if (arg.Done > 0) { double eta = (double)i / (double)arg.Done * (double)arg.Total; arg.ETA = TimeSpan.FromSeconds(eta); } OnScanStateChanged(arg); } arg.End = DateTime.UtcNow; OnScanStateChanged(arg); _logger.LogInformation("Decoding finished"); }); PopulateDb(); }
protected virtual void OnScanStateChanged(ScanState e) { EventHandler handler = ScanStateChanged; handler?.Invoke(this, e); }