Exemplo n.º 1
0
 /// <summary>
 /// Остановка проверки.
 /// </summary>
 private void StopProgramm()
 {
     M_Model.IsStopBtnEnabled       = false;
     M_Model.IsStartBtnEnabled      = true;
     M_Model.IsChooseFileBtnEnabled = true;
     CheckButtonsEnabled();
     AutoWorkTimer.Stop();
 }
Exemplo n.º 2
0
        /// <summary>
        /// Старт проверки.
        /// </summary>
        private async void StartProgramm()
        {
            if (_dbInstance == null)
            {
                ReinitDbInstance();
            }

            if (_dbInstance == null)
            {
                StopProgramm();
                return;
            }

            M_Model.IsStartBtnEnabled      = false;
            M_Model.IsStopBtnEnabled       = true;
            M_Model.IsChooseFileBtnEnabled = false;

            if (_dbInstance != null && !await _dbInstance.CheckMongoConnection())
            {
                StopProgramm();
                return;
            }

            var fileLists = new List <string>(M_Model.UncheckedFiles.ToList());

            var uncheckedFilesEnumerator = fileLists.GetEnumerator();

            var makeWorkTimer = new DispatcherTimer {
                Interval = TimeSpan.FromSeconds(10)
            };

            EventHandler autoWorkHandler = (sender, args) =>
            {
                //Обработчик "локального" таймера. Отслеживает количество потоков и количество оставшихся файлов.
                EventHandler makeWorkHandler = async(mwSender, mwArgs) =>
                {
                    //Если текущее количество выполняемых потоков больше определенного количества
                    //(указывается в настройках), то текущий "тик" можно пропустить.
                    if (_threadCount >= ProgramSettings.GetInstance().ThreadCount)
                    {
                        return;
                    }

                    //Цикл из количества доступных потоков, в которым идет обработка данных
                    for (; _threadCount < ProgramSettings.GetInstance().ThreadCount;)
                    {
                        //Проходимся по коллекции, если в ней еще есть файлы.
                        if (uncheckedFilesEnumerator.MoveNext())
                        {
                            //Обрабатываем файлы
                            await MakeWorkAsync(uncheckedFilesEnumerator.Current);

                            //После обработки, удаляем его
                            M_Model.UncheckedFiles.Remove(uncheckedFilesEnumerator.Current);
                        }
                        //Если файлов не осталось - останавливаем все таймеры и выходим из цикла.
                        else
                        {
                            makeWorkTimer.Stop();
                            StopProgramm();
                            break;
                        }
                    }
                };

                //Запускаем "локальный" таймер, привязывая к нему обработчик.
                makeWorkTimer.Tick += makeWorkHandler;
                makeWorkTimer.Start();
                makeWorkHandler(this, EventArgs.Empty);
            };

            //По нажатию кнопки старт мы запускаем "главный" таймер и программа начинает выполнять свою работу
            //сразу же.
            AutoWorkTimer.Tick += autoWorkHandler;
            AutoWorkTimer.Start();
            autoWorkHandler(this, EventArgs.Empty);
        }