【问题标题】:Use windows service to run a method every on second使用 Windows 服务每秒运行一个方法
【发布时间】:2022-01-09 04:29:51
【问题描述】:

您好,我在程序中编写了一个调用 Rest Api 并获取一些信息的方法。 我想每分钟都打电话。我填写了 OnStart 和 OnStop 以及我的方法所在的所有 timer_Elapsed。我安装我的服务并启动它,但它只是第一次运行,如果有人知道解决方案可以帮助我,永远不会再重复。提前谢谢你

开始时:

        protected override void OnStart(string[] args)
     {
        ///just for log to show program is working 
        ayandehBLL.Save_Log("Service started...", nameof(OnStart));


        if (timer == null)
        {
            timer = new Timer();
            timer.AutoReset = true;
            timer.Interval = 3000;    //* 
            Convert.ToDouble(ConfigurationManager.AppSettings["IntervalMinutes"]);
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Start();
        }
    }

    protected override void OnStop()
    {
        timer.Stop();
        timer.Enabled = false;
        ayandehBLL.Save_Log("Service stoped", nameof(OnStop));
        //WriteErrorLog("Test window service Stoped");
    }
  -----------------------------
    private void timer_Elapsed(object source, System.Timers.ElapsedEventArgs e)
      {
        var a = ayandehBLL.GetProductCode();
        ayandehBLL.Save_Log($"Request national code is {a}", "test");
        if (a != null)
        {
            Request_DOM request = new Request_DOM();
            request.ProductCode= a;
            try
            {
                var result = ayandehBLL.GetMyProductInfo(request);

                if (result != null)
                {
                    ayandehBLL.Save_Log(JsonConvert.SerializeObject(result), nameof(OnStart));
                }
                else
                {
                    ayandehBLL.Save_Log("GetMyProductInfo() returned null", nameof(OnStart));
                }
            }
            catch (Exception ex)
            {
                ayandehBLL.Save_Log(ex.Message.ToString(), "OnElapsedTime");
            }
        }
        else
        {
            ayandehBLL.Save_Log("Request national code is null", "OnElapsedTime");
        }
        //WriteErrorLog("OnElapsedTime done");
    }   

【问题讨论】:

  • 您配置服务的方式很好。但是,我认为在第一次执行处理程序 timer_Elapsed 之后出现错误。您能否向我们提供日志,以便我们找出问题所在?
  • 我没有任何错误,我用 windows 窗体测试它并生成数据,我在 time_elapsed 中复制 button_click 事件中的代码。
  • 当您在 Windows 中签入服务时,您的服务是仍在运行还是已停止?

标签: c# api methods timer windows-services


【解决方案1】:

由计时器触发的方法正在计时并在单独的线程中运行。如果您的主线程到达程序结束,程序将停止并且计时器停止。因此,您必须在程序结束之前在一个循环中捕获主线程,直到您希望它这样做,程序才会结束。

【讨论】:

  • 使用while(true) 是个坏主意。那根线只会旋转,吸收能量。您需要将控制权交还给操作系统。你可以用await Task.Delay 或类似的东西做一个while循环。
  • 好吧,我假设程序在timer.Elapsed 可以再次触发该方法之前结束。计时器配置是正确的,所以我不知道还有什么可能。您是否调试过您的程序以查看它何时结束?
  • 是的,你是对的,while(true) 在性能方面是一个非常糟糕的主意,但这只是一个如何无限期运行代码的示例。我将为将来的用户删除该部分。重点是,不允许程序停止运行,否则定时器也会终止。
  • @Despacito2 感谢您的回复。我通过在每一行中添加对文件日志的写入来解决问题,我的问题是指我的连接字符串。
  • 哦,我没想到这种可能性。很好的解决办法!祝你的项目好运。
猜你喜欢
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2015-01-18
相关资源
最近更新 更多