【问题标题】:Windows service won't stopWindows 服务不会停止
【发布时间】:2015-10-07 12:29:42
【问题描述】:

我制作了这个小程序,它有一个有趣的行为,我无法解决。 这个想法是让它像一个调度程序一样,它会在特定时间过去后执行一个命令。一切都按预期工作,但是当我关闭服务时,我意识到了一些事情。 1.服务需要很长时间才能关闭。有时超过 30 分钟,我也不得不杀死 PID。 2.服务运行的时间越长,关闭的时间就越长。我认为这与命令执行的次数有关。 3.我认为每次迭代的时间间隔越短越容易关闭服务。

这是我正在使用的代码。

public void Start()
{
    _cancellationToken = new CancellationTokenSource();
    var token = _cancellationToken.Token;

    _pollingTask = Task.Factory.StartNew(
        () =>
        {
            while (true)
            {
                try
                {
                    Log.Debug("Call Import PDF");
                    ConnectUncPaths();
                    ImportPdf();
                    Thread.Sleep(Intervall * 60000);
                    if (token.IsCancellationRequested)
                        break;
                }
                catch (Exception)
                {
                    DissconnectUncPaths();
                }
            }
        }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current);
    }

    public void Stop()
    {
        _cancellationToken.Cancel();
        _pollingTask.Wait();
}

这是截图

【问题讨论】:

  • Thread.Sleep(Intervall * 60000); - 不是一个好主意。
  • 如果只是因为即使是 10 的“间隔”也意味着 10 分钟的等待......
  • 如果你想延迟执行,使用Task.Delay,not Thread.Sleep。您正在浪费一个线程池线程,并且在线程唤醒之前您将无法取消任务

标签: c# topshelf


【解决方案1】:

它不会停止,因为 Thread.Sleep 在延迟结束之前不会结束。相反,尝试这样的事情:

public void Start()
{
    _cancellationToken = new CancellationTokenSource();
    var token = _cancellationToken.Token;

    _pollingTask = Task.Factory.StartNew(
        () =>
        {
            while (!token.IsCancellationRequested)
            {
                try
                {
                    Log.Debug("Call Import PDF");
                    ConnectUncPaths();
                    ImportPdf();
                    Task.Delay(TimeSpan.FromMinutes(Intervall), token)
                }
                catch (Exception)
                {
                    DissconnectUncPaths();
                    break;
                }
            }
        }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2014-01-13
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多