在C#Web服务中使用多个计时器

时间:2016-11-13 20:18:03

标签: c# web-services timer sql-server-2008-r2

我正在尝试在一小时内执行3次数据库相关操作。

1:每隔一分钟检查特定时间

2:每15分钟后更新一次特定记录

3:每60分钟后更新一次特定记录

直到15分钟一切都很好......但是在15分钟内,2个计时器必须同时访问数据库。所以这就是为什么它给我看错了。 Connection is already Open。现在60分钟后,所有三个Timer同时访问数据库,这就是为什么它会再次显示消息Connection is Already Open。 60分钟后一切正常,直到15分钟。但接下来的15分钟将到来。消息将再次可见,依此类推。这是Timer

定时器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();
        }

定时器2:

    _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;

任何人都可以指导我在Web服务中的Timer中执行这三项操作的最佳方法

我使用的是Sql Server 2008R2 Express Edition

由于

1 个答案:

答案 0 :(得分: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();
    // ...
}