【发布时间】: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。您正在浪费一个线程池线程,并且在线程唤醒之前您将无法取消任务