我有一个在.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
块按预期工作。
我在事件日志中没有看到任何未处理的异常。
思想?
答案 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的跟踪线,这意味着服务按预期工作。