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