2016-11-13 1 views
0

Я пытаюсь выполнить 3 операции с базой данных в One Hour.Работа с несколькими таймерами в веб-службе C#

1: Проверка на определенный момент времени на каждую минуту

2: Обновление конкретных записей После того, как каждые 15 минут

3: Обновление конкретных записей через каждые 60 минут

До 15 минуту все Ok ... Но в 15 минут 2 таймера должны одновременно обращаться к базе данных. Вот почему он показывает мне ошибку. Connection is already Open. Теперь через 60 минут все три таймера одновременно получают доступ к базе данных, поэтому он снова отображает сообщение Connection is Already Open. Через 60 минут все нормально до 15 минут. Но когда наступят следующие 15 минут. Сообщение будет снова видимым и так далее. Вот Таймер

Таймер1:

_Timer = new Timer(); 
    this._Timer.Interval = 1000 * 60 * 1; 
    this._Timer.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer_Tick); 
    _Timer.Enabled = true; 

Вот _Timer_Tick Метод

CheckConnnectionStatus(); 
    string cGroupQuery = "select value from settings where id=1 "; 

     try 
     { 
      sqlConnection.Open(); 
      sqlCommand = new SqlCommand(cGroupQuery, sqlConnection); 
      sqlDataReader = sqlCommand.ExecuteReader(); 
      if (sqlDataReader.Read()) 
      { 
       string value= sqlDataReader[0].ToString(); 

       if (value== "True") 
       { 
        Library.WriteErrorLog("System State Done Successfully"); 
        TakeSystemState(); 
        UpdateSystemState(); 
       } 
      } 
     } 
     catch (Exception exp) 
     { 
      Library.WriteErrorLog(exp.Message.ToString() + " | Exception in CheckPrayerTime"); 
     } 
     finally 
     { 
      CheckConnnectionStatus(); 
     } 

Timer2:

_Timer02 = new Timer(); 
    this._Timer02.Interval = 1000 * 60 * 15; 
    this._Timer02.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer02_Tick); 
    _Timer02.Enabled = true; 

Таймер 3:

_Timer03 = new Timer(); 
    this._Timer03.Interval = 1000 * 60 * 60; 
    this._Timer03.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer03_Tick); 
    _Timer03.Enabled = true; 

Может кто-нибудь наставит меня лучший подход, чтобы выполнить эти три операции в Timer в веб-службы

Я использую Sql Server 2008R2 Express Edition

Благодаря

+1

Не могли бы вы поделиться реализацию из ' _Timer_Tick' с нами? –

+0

@ botond.botos, да, конечно. Пожалуйста, просмотрите отредактированный пост сейчас –

+0

Почему вы решили поместить эти операции с базой данных в веб-службу? Реализация его как службы Windows кажется более адекватной. Или вы можете реализовать его как простое консольное приложение, которое вызывается планировщиком задач, поэтому вам вообще не нужно беспокоиться о части «Таймер». –

ответ

1

Согласно документации, метод SqlConnection.Open() бросает InvalidOperationException если соединение уже открыто. Для получения более подробной информации см: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.110).aspx

В качестве решения, можно создать новый объект SqlConnection в каждом из ваших методов обработчиков событий Timer и Dispose(), как только вы закончите с обработкой.

Это хорошая практика, чтобы поместить вновь созданный SqlConnection объект в using заявлении, так что соединение будет выпущен, даже если было сгенерировано исключение:

using (var conn = new SqlConnection()) 
{ 
    conn.Open(); 
    // ... 
} 
+0

Возможно, эта проблема возникает, потому что я использую один объект для доступа к базе данных для всех таймеров?. 'sqlConnection' –

+1

Абсолютно. Ответ обновлен. –

+0

Так что я должен использовать другой объект для всех трех таймеров? для timer1-> sqlCon для timer2-> sqlCon02 для timer3-> sqlCon03 ?? –