Windows服务不会停止

时间:2015-10-07 12:29:42

标签: c# topshelf

我做了这个小程序,有一个我无法解决的有趣行为。 这个想法是为了使它像调度程序一样,它将在特定时间过后执行命令。一切都按预期工作,但当我关闭服务时,我意识到了一些事情。 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();
}

这是截图

enter image description here

1 个答案:

答案 0 :(得分:3)

它不会停止,因为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);
}