C# Windows服务和数据库连接
(我不熟悉Windows服务) 我有一个自动windows服务,它从数据库表中获取一些记录,为每个记录调用一个web服务方法,并将该方法的返回值和一些其他信息插入表中。 我的问题如下: 1-当我尝试手动启动服务时,出现C# Windows服务和数据库连接,c#,database,oracle,windows-services,onstart,C#,Database,Oracle,Windows Services,Onstart,(我不熟悉Windows服务) 我有一个自动windows服务,它从数据库表中获取一些记录,为每个记录调用一个web服务方法,并将该方法的返回值和一些其他信息插入表中。 我的问题如下: 1-当我尝试手动启动服务时,出现错误1053(服务未及时响应启动或控制请求)。顺便说一下,尽管出现了错误,服务还是会启动并执行它必须执行的操作 2-(我知道这是一个常见问题,但我更愿意再次询问)该服务是自动的,但取决于数据库连接。当运行服务的系统重新启动时,我必须手动启动它。我添加了一行Thread.Sleep(
错误1053(服务未及时响应启动或控制请求)
。顺便说一下,尽管出现了错误,服务还是会启动并执行它必须执行的操作
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()
方法,但在服务运行时没有停止函数,我想停止它。
我还应该提到,我的服务始终处于启动模式,从不更改为已启动
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)循环。是否有更换此部件的建议?我将对您的服务提出一些建议
Timer\u appeased()
函数中调用此函数while(true)
-->这非常令人不安,尤其是我没有看到中断代码>这很重要,我希望服务持续运行代码的这一部分。这是一种让服务变得糟糕的方式。对于我想做的事情,你还有其他建议吗?我对服务非常陌生。最佳方式-服务侦听端口,只有在收到消息开始处理现有作业时才会唤醒。常见的方法是设置计时器并定期检查作业。第一种方法不是太复杂,而是更复杂。二是琐碎。您将初始化服务“onStart”并启动计时器。“onStart”上不应该有任何逻辑执行,我不能将其设置为手动启动。它运行的系统有很多次重新启动,我不是唯一一个使用它的用户。我也不能让它每天在一个准确的时间工作,它应该做的是一项即时任务。谢谢你剩下的回复,我会尝试你的建议。@Narges你可以玩属性,检查和一些可用的帮助。您也可以使用自动。或者,如果不启动服务,则可以编写exe来验证服务是否在重新启动时运行。您可以搜索SC命令或WMIC。。仅供参考,别把你弄糊涂了。