2016-11-13 2 views
0

Ich versuche, 3 datenbankbezogene Vorgänge in einer Stunde auszuführen.Mit mehreren Zeitgebern im C# -Webdienst arbeiten

1: Überprüfen für bestimmte Zeit auf jede Minute

2: Aktualisieren bestimmte Datensätze nach jeder 15 Minuten

3: Aktualisieren bestimmte Datensätze nach jeder 60 Minuten

Bis 15. Minute alles Ok ... Aber auf 15 Minuten muss 2 Timer gleichzeitig auf die Datenbank zugreifen. Deshalb zeigt es mir einen Fehler. Connection is already Open. Jetzt nach 60 Minuten greifen alle drei Timer gleichzeitig auf die Datenbank zu, weshalb sie die Nachricht erneut anzeigen wird Connection is Already Open. Nach 60 Minuten ist alles normal bis 15 Minuten. Aber wenn die nächsten 15 Minuten kommen. Nachricht wird wieder sichtbar und so weiter. Hier Timer

Timer1:

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

Hier ist _Timer_Tick Methode

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; 

Timer3:

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

mir jemand beste Ansatz führen kann, diese drei Operationen in Timer in Web Service

Ich bin mit SQL Server 2008R2 Express Edition

Dank

+1

Könnten Sie die Durchführung der Aktie ' _Timer_Tick' Methode bei uns? –

+0

@ botond.botos, ja sicher. Bitte überprüfen Sie den bearbeiteten Beitrag –

+0

Warum haben Sie sich entschieden, diese Datenbankoperationen in einen Webdienst zu stellen? Die Implementierung als Windows-Dienst scheint angemessener zu sein. Oder Sie können es als eine einfache Konsolenanwendung implementieren, die von einem Taskplaner aufgerufen wird, so dass Sie sich nicht um den 'Timer'-Teil kümmern müssen. –

Antwort

1

Gemäß der Dokumentation, die SqlConnection.Open() Methode löst eine InvalidOperationException auszuführen wenn die Verbindung bereits geöffnet ist. Weitere Informationen: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.110).aspx

Als Lösung ein neues SqlConnection Objekt in jedem Ihrer Timer Event-Handler-Methoden schaffen könnte und Dispose() es, wenn Sie mit der Bearbeitung fertig sind.

Es ist eine gute Praxis, die neu erstellen SqlConnection Objekt in einer using Aussage zu platzieren, so dass die Verbindung auch freigegeben werden, wenn eine Ausnahme ausgelöst wurde:

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

Kann dieses Problem auftreten, weil ich ein Objekt verwende, um auf die Datenbank für alle Timer zuzugreifen? 'sqlConnection' –

+1

Absolut. Antwort aktualisiert –

+0

Also sollte ich verschiedene Objekte für alle drei Timer verwenden? für timer1-> sqlCon für timer2-> sqlCon02 für timer3-> sqlCon03 ?? –