/// <summary> /// Остановка проверки. /// </summary> private void StopProgramm() { M_Model.IsStopBtnEnabled = false; M_Model.IsStartBtnEnabled = true; M_Model.IsChooseFileBtnEnabled = true; CheckButtonsEnabled(); AutoWorkTimer.Stop(); }
/// <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); }