(我是Windows服务的新手)我有一个自动窗口服务,它从数据库表中获取一些记录,为每个记录调用一个web服务方法,并将该方法的返回值和一些其他信息插入到表中。我的问题如下:
1-当我尝试手动启动服务时,我得到Error 1053 (the service did not respond to the start or control request in a timely fashion)
。顺便说一句,尽管有错误,服务还是会启动并做它必须做的事情。
2-(我知道这是一个常见的问题,但我更愿意再问一次)服务是自动的,但取决于数据库连接。当服务运行的系统重新启动时,我不得不手动启动它。我添加了一行Thread.Sleep()
代码来避免这个问题。解决这个问题的真正方法是什么?
protected override void OnStart(string[] args)
{
checkRegistryForOracleNLS();
//Creating event log
plog = new System.Diagnostics.EventLog();
if (!System.Diagnostics.EventLog.SourceExists("Prov"))
{
System.Diagnostics.EventLog.CreateEventSource("Prov", "ProvLog");
}
plog.Source = "Prov";
plog.Log = "ProvLog";
plog.Clear();
Log("Service started at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);
class_ora_tran.int_class_ora_tran();
DataTable dt;
Thread.Sleep(300000);
while (true)
{
Con2DB();
if (class_ora_tran.dbConnected())
{
RemoveOldRecords();
dt = FetchRec();
if (dt != null)
{
if (dt.Rows.Count > BLKSize)
Bulk(dt);
else
Single(dt);
}
}
}
}
3-虽然我写了OnStop()
方法,但当服务正在运行时,没有Stop函数,我想停止它。我还应该提到,我的服务始终处于"启动"模式,从未更改为"已启动"。
Protected void OnStop(string[] args)
{
class_ora_tran.Disconnect();
Log("Service stoped at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);
plog.Close();
}
4-偶尔,尽管状态正在启动,但我的服务会停止它必须做的事情,并且不会从表中获取记录。这种情况以前发生过两次,不幸的是,我忘记检查事件查看器,看看是否发生了一些错误。有人知道是什么原因吗?这与我上面提到的问题有关吗?
5-每次我想卸载服务时,我都必须运行两次卸载命令!有什么帮助吗?
编辑:有争议地将记录插入到表中,并且每当向表中输入新记录时,都应执行调用web服务等过程。我认为需要一个While(true)循环。有没有更换这个零件的建议?
我会为您的服务提出一些建议。
- 让您的服务成为手动启动。因此,一旦安装了该服务,只需手动启动一次即可
-
在您开始之后,您有一些好的选择来运行您的逻辑。
每X分钟运行一次http://www.codeproject.com/Questions/540617/windowsplusserviceplustoplusrunpluseveryplusoneplu
每天hh:mm运行Windows服务以在指定时间运行函数.立即运行
-
把你的代码放在一个函数中,并在
Timer_Elapsed()
函数中调用这个函数,你可以在上面的链接示例中选择它 -
使用OnStart设置定时器信息、读取配置文件等
-
请尝试使用windows的"添加/删除"程序删除该服务。(创建安装程序msi以安装您的服务。保存命令行)如何使用Visual Studio 为.net Windows服务创建安装程序