是我的计时器导致我的应用程序挂起
本文关键字:我的 应用程序 挂起 计时器 | 更新日期: 2023-09-27 18:04:19
这个问题我已经挠头好几天了。我想要一个计时器,每隔50秒重启一次应用程序。代码基本上每隔50秒获取一次数据库项并执行一些操作。然而,当有很长一段时间不活动时,它似乎会在一夜之间悬挂。我只展示了下面代码的框架。在代码中也有一个连接到mysql数据库,rest httpwebrequest和ssh使用renci。SSH连接到另一台计算机。
static void Main(string[] args)
{
Timer timer = new Timer(state => workDone(), null, 50000, 50000);
workDone();
}
private static void workDone()
{
//Hold program open for next cycle
Console.ReadLine();
}
在代码末尾的某个地方,我还使用了Console.ReadLine();使程序保持打开状态。为什么在一段时间不活动后,这个会挂起来?我怀疑这是我的代码,但它也可能是linux盒子?将张贴整个代码,如果需要。非常感谢你的帮助。欢呼。
我猜你是想这样做:
private static Timer timer;
static void Main(string[] args)
{
timer = new Timer(state => workDone(), null, 0, 50000);
// Hold program open...
Console.ReadLine();
}
private static void workDone()
{
// Do work
}
我认为通过阻塞回调,你最终会耗尽线程池。
从MSDN:为callback指定的方法应该是可重入的,因为它是在ThreadPool线程上调用的。如果计时器间隔小于执行该方法所需的时间,或者如果所有线程池线程都在使用并且该方法多次排队,则可以在两个线程池线程上同时执行该方法。
在您的示例中,执行回调的时间是无限长的,因为它在等待用户输入时阻塞。
如果你想执行这样的计算,我建议你有一个独立的线程,其中包含一个Sleep(50000)调用。原因是,如果你的计算时间超过50秒,你可能会产生额外的开销。
所以在你的线程中测量开始时间,做你的计算,测量结束时间,然后计算计算时间,做一个50秒的睡眠-"计算时间"。确保这个数字是正的,并设置10秒的最小睡眠,以便在计算时间超过40秒时给其他任务留出一些空闲时间。
Thread thread = new Thread(new ThreadStart(myThreadFunction)); thread.Start();
:
public void myThreadFunction()
{
Stopwatch stopWatch = new Stopwatch();
while(someCondition) {
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
doWork();
stopWatch.Stop();
long elapsed = stopWatch.ElapsedMilliseconds;
if(elapsed < 10000) elapsed = 10000;
Thread.Sleep(elapsed);
}
}
**doWork()没有ReadLine调用