【问题标题】:how delay on method OnStop in service windows?如何延迟服务窗口中的 OnStop 方法?
【发布时间】:2019-03-13 13:12:30
【问题描述】:

我有一个 Windows 服务正在使用一个 API,它每次启动时都会向 API 发送数据,当服务被禁用时,需要将此信息带到 API。我正在使用 Thread,但是它不遵守确定的时间,因此它没有时间发送有关 API 服务已停止的信息。

如何延迟服务停止并让数据有时间到达 API?

protected override void OnStart(string[] args)
    {
        _writeFile.Log("Foi iniciado o serviço");

        _shutdownEvent = new ManualResetEvent(false);
        _thread = new Thread(async () => await ControlSendHistorico());
        _thread.Start();

        base.OnStart(args);
    }

    protected override void OnStop()
    {
        if (_stopping) return;
        try
        {
            _stopping = true;
            _shutdownEvent.Set();
            //_shutdownEvent.WaitOne(30000);
            _thread.Join(30000);


            _writeFile.Log("O serviço foi parado");
            base.OnStop();
        }
        catch (Exception e)
        {
            _writeFile.Log("Falha ao parar o serviço " + e.Message);
        }
        finally
        {
            _stopping = false;
        }
    }

【问题讨论】:

  • 请分享ControlSendHistorico()方法的实现。
  • @stuartd 这个方法我用过,但是没有解决问题
  • 当停电,电脑没电了?在停止类型的动作中,你永远不应该尝试做任何耗时的事情——你永远不能保证你会有时间去做。最好重新设计,以便您可以在下一次启动时执行某种恢复,此时您希望有尽可能多的时间。

标签: c# windows service


【解决方案1】:

我使用“Thread.Sleep();”解决了这个问题 它确实锁定了服务的主线程,而不是像我那样锁定中间线程。

protected override void OnStop()
{
    if (_stopping) return;
    try
    {
        _stopping = true;
        _shutdownEvent.Set();
        Thread.Sleep(500);

        _writeFile.Log("O serviço foi parado");
        base.OnStop();
    }
    catch (Exception e)
    {
        _writeFile.Log("Falha ao parar o serviço " + e.Message);
    }
    finally
    {
        _stopping = false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多