C# Windows服务和数据库连接

C# Windows服务和数据库连接,c#,database,oracle,windows-services,onstart,C#,Database,Oracle,Windows Services,Onstart,(我不熟悉Windows服务) 我有一个自动windows服务,它从数据库表中获取一些记录,为每个记录调用一个web服务方法,并将该方法的返回值和一些其他信息插入表中。 我的问题如下: 1-当我尝试手动启动服务时,出现错误1053(服务未及时响应启动或控制请求)。顺便说一下,尽管出现了错误,服务还是会启动并执行它必须执行的操作 2-(我知道这是一个常见问题,但我更愿意再次询问)该服务是自动的,但取决于数据库连接。当运行服务的系统重新启动时,我必须手动启动它。我添加了一行Thread.Sleep(

(我不熟悉Windows服务) 我有一个自动windows服务,它从数据库表中获取一些记录,为每个记录调用一个web服务方法,并将该方法的返回值和一些其他信息插入表中。 我的问题如下:

1-当我尝试手动启动服务时,出现
错误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)循环。是否有更换此部件的建议?

我将对您的服务提出一些建议

  • 使您的服务成为手动启动。因此,一旦您安装了服务,您只需手动启动它一次
  • 开始之后,您有一些很好的选项来运行逻辑

    。每X分钟运行一次

    。每天以hh:mm的速度跑步 . 马上跑

  • 将代码放入函数中,并在上面链接示例中选择的
    Timer\u appeased()
    函数中调用此函数

  • 使用OnStart设置计时器信息、读取配置文件等

  • 尝试使用windows添加/删除程序删除该服务。(创建安装程序msi以安装服务。保存命令行)


  • while(true)
    -->这非常令人不安,尤其是我没有看到
    中断这很重要,我希望服务持续运行代码的这一部分。这是一种让服务变得糟糕的方式。对于我想做的事情,你还有其他建议吗?我对服务非常陌生。最佳方式-服务侦听端口,只有在收到消息开始处理现有作业时才会唤醒。常见的方法是设置计时器并定期检查作业。第一种方法不是太复杂,而是更复杂。二是琐碎。您将初始化服务“onStart”并启动计时器。“onStart”上不应该有任何逻辑执行,我不能将其设置为手动启动。它运行的系统有很多次重新启动,我不是唯一一个使用它的用户。我也不能让它每天在一个准确的时间工作,它应该做的是一项即时任务。谢谢你剩下的回复,我会尝试你的建议。@Narges你可以玩属性,检查和一些可用的帮助。您也可以使用自动。或者,如果不启动服务,则可以编写exe来验证服务是否在重新启动时运行。您可以搜索SC命令或WMIC。。仅供参考,别把你弄糊涂了。