Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        protected virtual void OnScanStateChanged(ScanState e)
        {
            EventHandler handler = ScanStateChanged;

            handler?.Invoke(this, e);
        }