public MainViewModel() { ChooseFilesCommand = new DelegateCommand(action => ChooseFiles()); ExitCommand = new DelegateCommand(action => Exit()); PrintResultCommand = new DelegateCommand(action => PrintResult()); SaveToFileCommand = new DelegateCommand(action => SaveToFile()); ShowAboutAuthorCommand = new DelegateCommand(action => ShowAboutAuthor()); ShowAboutProgrammCommand = new DelegateCommand(action => ShowAboutProgramm()); ShowSettingsCommand = new DelegateCommand(action => ShowSettings()); StartCommand = new DelegateCommand(action => StartProgramm()); StopCommand = new DelegateCommand(action => StopProgramm()); ClearResultCommand = new DelegateCommand(action => ClearResult()); ShowExpandedResultCommand = new DelegateCommand(action => ShowExpandedResult()); AutoWorkTimer = new DispatcherTimer { Interval = TimeSpan.FromHours(1) }; try { _dbInstance = DataBase.GetInstance(ProgramSettings.GetInstance().ConnectionString, ProgramSettings.GetInstance().DataBaseName, ProgramSettings.GetInstance().Login, ProgramSettings.GetInstance().Password); } catch (Exception e) { _dbInstance = null; Console.Error.WriteLine("Скорее всего, не удалось подключиться к серверу MongoDb.\n" + e.Message); } }
/// <summary> /// Возвращает единственный экземпляр класса ProgramSettings. Необходим для паттерна Singleton /// </summary> /// <returns>ProgramSettings instance single object</returns> public static ProgramSettings GetInstance() { if (_instanceSettings == null) { _instanceSettings = new ProgramSettings(); return(_instanceSettings); } return(_instanceSettings); }
private static void ReinitDbInstance() { try { _dbInstance = DataBase.GetInstance(ProgramSettings.GetInstance().ConnectionString, ProgramSettings.GetInstance().DataBaseName, ProgramSettings.GetInstance().Login, ProgramSettings.GetInstance().Password); } catch (Exception e) { Console.Error.WriteLine("Скорее всего, не удалось подключиться к серверу MongoDb.\n" + e.Message); _dbInstance = null; } }
public static void LoadSettings(ProgramSettings loadedProgramSettings) { //other settings ProgramSettings.GetInstance().IsDoc = loadedProgramSettings.IsDoc; ProgramSettings.GetInstance().IsDocx = loadedProgramSettings.IsDocx; ProgramSettings.GetInstance().IsRtf = loadedProgramSettings.IsRtf; ProgramSettings.GetInstance().IsOtd = loadedProgramSettings.IsOtd; ProgramSettings.GetInstance().IsPdf = loadedProgramSettings.IsPdf; ProgramSettings.GetInstance().IsTxt = loadedProgramSettings.IsTxt; ProgramSettings.GetInstance().FileTypes = loadedProgramSettings.FileTypes; ProgramSettings.GetInstance().ThreadCount = loadedProgramSettings.ThreadCount; //database and repo ProgramSettings.GetInstance().ConnectionString = loadedProgramSettings.ConnectionString; ProgramSettings.GetInstance().DataBaseName = loadedProgramSettings.DataBaseName; ProgramSettings.GetInstance().Login = loadedProgramSettings.Login; ProgramSettings.GetInstance().Password = loadedProgramSettings.Password; }
/// <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); }