C#Windows服务SqlCommand挂起

时间:2014-04-08 18:06:34

标签: c# sql-server windows-services sqlexception

我有一个在.NET 4.5中运行的Windows服务。一切正常。但是,当我的服务遇到SqlException时,它会挂起(变成僵尸)。

我有一个调用System.Timers的计时器(process)。在process中,找到cmd.ExecuteReader()。如果我从存储过程中删除EXECUTE权限,则会收到SqlException(按预期方式)。发生这种情况时,服务就会挂起。

我原以为其中一个try {} catch块可以捕获异常并优雅地退出该方法。但是,系统似乎挂起此呼叫。我在代码中有一些Trace语句。我删除它们以便更容易阅读。

private void TimerForNotification_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    TimerForNotification.Stop();
    int count = new GetSMSNotifications().process();
    TimerForNotification.Start();
}

public int process()
{
    int count = 0;

    // Get the ConnectionStrings collection.
    ConnectionStringSettings connections = ConfigurationManager.ConnectionStrings["DE_OLTP"];

    try
    {
        using (SqlConnection conn = new SqlConnection(connections.ConnectionString))
        {
            conn.Open();

            SqlCommand cmd = new SqlCommand("[dbo].[get_SMSToSend]", conn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

                while (dr.Read())
                {
                    // increment counter
                    count++;

                    string destinationAddress = Convert.ToString(dr[dr.GetOrdinal("DestinationAddress")]);
                    string alertMessage = Convert.ToString(dr[dr.GetOrdinal("Content")]);

                    // Send out the notification
                    sendPush(destinationAddress, alertMessage);
                }

                dr.Close();
            }
            catch (SqlException se)
            {
                DELog.Log.Error(se);
            }
        }
    }
    catch (Exception ex)
    {
        DELog.Log.Error(ex);
    }

    return count;
}

有趣的是,我创建了一个调用上述方法的控制台应用程序,try {} catch块按预期工作。

我在事件日志中没有看到任何未处理的异常。

思想?

2 个答案:

答案 0 :(得分:1)

问题解决了。它出现我的服务的原因是因为我缺少对Entity.Framework.dll的引用。当服务遇到异常时,无法找到EF dll。我在记录层中使用EF。

我能够通过安装我的服务然后ATTACHing到运行过程来发现这个问题。

答案 1 :(得分:0)

试试这些:

为这些添加跟踪线:

TimerForNotification.Stop();

try
{
 int count = new GetSMSNotifications().process();
}
catch (Exception ex)
{
 // trace line here with ex.ToString().
}

TimerForNotification.Start();
// trace line here stating, i started at DateTime.Now;

删除执行权限,看看上面的代码是否生成了跟踪线。

如果是,则会显示异常详细信息。 (即使你的方法看起来很安全)也要相应地修复它。

如果catch没有跟踪,那么你应该看到post start trace的跟踪线,这意味着服务按预期工作。