是我的计时器导致我的应用程序挂起

本文关键字:我的 应用程序 挂起 计时器 | 更新日期: 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调用