private void _timer_Starter_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            _timerStarter.Stop();
            int streamNumber = GetFreeStream();
            if (streamNumber >= 0)
            {
                try
                {
                    // проверка связи с БД и соответствующая отметка
                    //if (CheckDBConnection("SPM таймер запуска стартовал. ", streamNumber, false))
                    {
                        DataDBJob job = null;
                        try
                        {
                                // считаем задание и попытаемя его запустить
                                lock (_siteBusy)
                                {
                                    lock (newjoblockstring)
                                    {
                                        job = new DataDBJob(_dbConnectionString, streamNumber, true, _siteBusy);
                                        if (job != null)
                                        {
                                            if (!String.IsNullOrEmpty(job.Site))
                                            {
                                                if (!string.IsNullOrEmpty(job.Site)) // задание захвачено
                                                {
                                                    _siteBusy[streamNumber] = job.Site; // сайт занят
                                                    lock (_siteBusyStart)
                                                        _siteBusyStart[streamNumber] = DateTime.Now;
                                                }
                                            }
                                            else
                                            {
                                                _timerStarter.Interval = 15000;
                                                Console.WriteLine(DateTime.Now+" no work");
                                            }
                                        }   
                                        else
                                        {
                                            _timerStarter.Interval = 15000;
                                            Console.WriteLine(DateTime.Now+" no work");
                                        }
                                    }
                                }
                                    if (!String.IsNullOrEmpty(job.Site))
                                    {
                                        Console.WriteLine(DateTime.Now + " On " + streamNumber + " stream started job " + job.Site);
                                        //ShowInfoMessage();
                                        _timerStarter.Interval = 1;
                                        //_timerStarter.Start();
                                        _timerStarter.Enabled=true;
                                        job.StartJob();
                                    }

                        }
                        catch (Exception ex) // ловим ошибку плагина
                        {
                            DataDBService ddbs = new DataDBService();
                            lock (_siteBusy)
                            ddbs.WriteErrorMessage(_dbConnectionString, streamNumber, "Сайт " + _siteBusy[streamNumber] + ". Необработанная ошибка плагина", ex.Message);
                            ddbs.Dispose();
                            GC.SuppressFinalize(ddbs);
                        }
                        finally
                        {
                            if (job != null)
                            {
                                lock (_siteBusy)
                                {
                                    if (!string.IsNullOrEmpty(_siteBusy[streamNumber]))
                                    {
                                        Console.WriteLine(DateTime.Now + " On " + streamNumber + " stream finished job " + job.Site);
                                        _siteBusy[streamNumber] = ""; // сайт свободен
                                        _siteBusyStart[streamNumber] = DateTime.MaxValue;
                                        _timerStarter.Interval = 1;
                                        //_timerStarter.Start();
                                        //ShowInfoMessage();
                                    }
                                    else
                                        _timerStarter.Interval = 15000;
                                }
                                { job.Dispose(); GC.SuppressFinalize(job); }
                            }
                                _timerStarter.Start();
                            //CheckDBConnection("SPM таймер запуска остановлен. ", streamNumber, false);
                        }
                    }
                }
                catch (Exception ex) // ловим ошибку соединения с БД
                {
                    Console.WriteLine("Ошибка 5675 "+ex.Message);
                }
                finally
                {
                    lock (_siteBusy)
                        _siteBusy[streamNumber] = ""; // сайт свободен
                }
            }
            else
            {
                _timerStarter.Interval = 15000;
                _timerStarter.Start();
                Console.WriteLine(DateTime.Now + " No free threads");
            }
        }
        private void _timer_Scheduler_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!_startTimerScheduler) // в один поток
            {
                if (CheckDBConnection("SPM таймер запуска стартовал. ", 10002, false))
                {
                    _startTimerScheduler = true;
                    this._timerScheduler.Stop();

                    try
                    {
                        DataDBJob job = new DataDBJob(_dbConnectionString, 10002, false, new string[15]);
                        job.JobSchedule();
                    }
                    catch (Exception ex) // ловим ошибку соединения с БД
                    {
                        DataDBService ddbs = new DataDBService();
                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 0, ex.Message);
                        ddbs.Dispose();
                        GC.SuppressFinalize(ddbs);
                    }
                    
                    this._timerScheduler.Start();
                    _startTimerScheduler = false;
                }
            }
        }
        public void OnStop()
        {
            //Останавливаем таймер Starter
            if(this._timerStarter!=null)
                this._timerStarter.Stop();
            //Останавливаем таймер Scheduler
            if(this._timerScheduler!=null)
                this._timerScheduler.Stop();

            // активность: выключение
            DataDBService ddbs = new DataDBService();
            ddbs.WriteMessageAboutActivity(_dbConnectionString, 10001, "SPM остановлен.");
            ddbs.Dispose();
            GC.SuppressFinalize(ddbs);

            // незаконченные задания - сброс состояния "занято"

            DataDBJob job = new DataDBJob(_dbConnectionString, 10002, false, new string[20]);
            job.JobToNoBusy();
            job.Dispose();
            GC.SuppressFinalize(job);
        }
        private bool NSetJobState(int id, int currentPage, int countPagesTotal, int CountAnnouncement, int jobid, HtmlDocument doc)
        {
            // текущие дата и время
            DateTime dateTime = DateTime.Now; //new DateTime();
            string dt = dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

            using (DataDBService ddbs = new DataDBService())
            {
                try
                {
                    //update
                    string SQLstr = "UPDATE [PJobUpdate] SET "
                                         + "  StartType=1"
                                         + " ,LastDate='" + dt + "'"
                        //+ " ,LastDocument= '" + doc.DocumentNode.InnerHtml.Replace("'", "''").Substring(0,999) + "'"
                                         + " ,CurrentPage=" + currentPage.ToString()
                                         + " ,CountPagesTotal=" + countPagesTotal.ToString()
                                         + " ,CountAnnouncement=CountAnnouncement+" + CountAnnouncement.ToString()
                                         + " ,Complete=" + (currentPage + 1 == _firstPage + _pageCount
                                                         || currentPage == countPagesTotal ? 1 : 0).ToString()
                        /* статус = 1  фиксируется в общем порядке
                        + (currentPage + 1 == _firstPage + _pageCount
                                        || currentPage == countPagesTotal ? " ,ParserStatus=1" : "")
                        */
                                         + (currentPage + 1 == _firstPage + _pageCount
                                         || currentPage == countPagesTotal ? " ,DateEnd='" + dt + "'" : "")
                                         + "  Where ID = " + id.ToString();
                    string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString);

                    if (!string.IsNullOrEmpty(s))
                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи текущего состояния задания. "
                            + jobid + ".");
                }
                finally
                { ddbs.Dispose();}
            }
            return (currentPage + 1 == _firstPage + _pageCount
                 || currentPage == countPagesTotal ? false : true);
        }