【问题标题】:Windows Service and database connectionWindows 服务和数据库连接
【发布时间】:2014-03-23 21:06:15
【问题描述】:

(我是 Windows 服务的新手) 我有一个自动 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) 循环。有什么更换这部分的建议吗?

【问题讨论】:

  • while (true) --> 这很令人不安,尤其是我没有看到break;
  • 这很重要,我希望服务不断运行这部分代码。
  • 这是一种可怕的服务方式
  • 你有什么其他建议可以做我想做的事吗?我是服务新手。
  • 最佳方式 - 服务侦听端口并仅在收到消息以开始处理现有作业时唤醒。常见的方法是设置定时器并定期检查作业。第一种方法并不过分复杂,但涉及更多。二是琐碎。您将启动您的服务“onStart”并启动计时器。 “onStart”上不应该有任何逻辑执行

标签: c# database oracle windows-services onstart


【解决方案1】:

我会为您的服务提出一些建议。

  1. 使您的服务成为手动启动。因此,一旦您安装了该服务,您只需手动启动一次即可。
  2. 开始后,您有一些不错的选择来运行您的逻辑。

    。每 X 分钟运行一次http://www.codeproject.com/Questions/540617/windowsplusserviceplustoplusrunpluseveryplusoneplu

    。每天以 hh:mm 运行Windows Service to run a function at specified time .立即运行

  3. 将您的代码放入一个函数中,并在上述链接示例中选择的Timer_Elapsed() 函数中调用此函数

  4. 使用 OnStart 设置定时器信息,读取配置文件等

  5. 尝试使用 Windows 添加/删除程序来删除该服务。 (创建一个安装程序 msi 来安装您的服务。保存您的命令行)How to create an installer for a .net Windows Service using Visual Studio

【讨论】:

  • 我无法将其设置为手动启动。它运行的系统有很多重启,我不是唯一使用它的用户。我也不能让它每天在一个确切的时间工作,它应该做的是一个直接的任务。感谢您其余的回复,我会尝试您的建议。
  • @Narges 您可以使用属性并检查并提供一些帮助ethertubes.com/make-a-program-run-as-a-windows-service-on-boot。您也可以使用自动。或者您可以编写一个 exe 来验证您的服务是否在重新启动时运行,如果没有启动它。您可以搜索 SC 命令或 WMIC .. 仅供参考,以免让您感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2018-02-01
相关资源
最近更新 更多