gpt4 book ai didi

c# - Timer(callback,...) 回调函数是否添加到堆栈?垃圾收集 Q 与此

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:18 25 4
gpt4 key购买 nike

我有一个功能需要在每个午夜归档 90 天前的电子邮件。我创建了一个类来处理这个,下面是示例:

    public void processArchives()
{
initializeTimer();
}

private void initializeTimer()
{
var now = DateTime.Now;
var tomorrow = now.AddDays(1);
var durationUntilMidnight = tomorrow.Date - now;

var t = new Timer(o => { attemptArchivalProcess(); }, null, TimeSpan.Zero, durationUntilMidnight);
}

private void attemptArchivalProcess()
{
//perform archival
initializeTimer(); //re-start timer to process tomorrow
}

问题是,重复调用 initializeTimer 会导致堆栈溢出(重复函数调用)还是会“永远”运行良好?

我是否应该能够将 processArchives() 作为新线程调用,并保持线程打开,或者我是否需要在 init 调用之后进行某种循环,例如:

    while(!Program.Closing){ sleep(...); }

防止它被垃圾收集?

最佳答案

我认为您已接近您的潜在解决方案。

计时器

回答您的第一个问题:正如您已经得出的结论,计时器将在它的委托(delegate)上结束。委托(delegate)将在一个单独的线程上执行,每个计时器流逝都会得到一个全新的自己的堆栈来执行。因此,无休止的定时器流逝事件永远不会触发 StackOverflowException

等到永远?

尝试回答您的第二个问题:您不必编写无限循环来让您的应用程序保持事件状态。但是,您可以这样做,这完全取决于您的应用程序需要什么。权衡利弊。

幸运的是还有更多可能的解决方案(没有对错,权衡它们以满足您的需求)

您可以考虑的解决方案 list :

Console.ReadLine()

如果您有一个控制台应用程序,您可以简单地等待用户输入。主线程将永远等待而不消耗处理器能力。

按照Servy的建议,创建一个定时任务

这样一来,您根本不必执行任何操作来编写无限循环。您的应用程序将在完成后简单地退出。如果您实际将此应用部署给用户,可能不是最漂亮的解决方案。

window 服务

您也可以寻求更成熟的解决方案并编写一个 windows 服务(听起来比实际更复杂,编写一个基本的 windows 服务非常简单)。这样你也不必为编写永无止境的循环而烦恼,Windows 服务将按照设计永远运行(当然你决定停止它的单元)

永不结束 while 循环的替代方案 - WaitHandle

您还可以使用信号机制(例如使用 AutoResetEvent),这样您的主线程就可以等待某个信号被设置。这样您也不必主动等待(=不消耗处理器周期)。

你有很多选择,这都归结为你的具体需求,我无法为你决定。 可以。 :)


所有这些话,让我们举一个例子。单元测试代表您的应用程序。定时器是一种不同的类型,即 System.Timers.Timer。您可以将该计时器设置为 AutoReset,这样您就不必创建新的计时器。

举个例子,我希望它对你有意义(如果没有,评论,也许我可以澄清)

    private Timer _processTimer;
private AutoResetEvent _resetSignal;

[Test]
public void YourImaginaryMainApp()
{
const int interval = 24 * 60 * 60 * 1000; // every day

_resetSignal = new AutoResetEvent(false);
_processTimer = new Timer(interval)
{
AutoReset = true
};
_processTimer.Elapsed += ProcessTimerOnElapsed;

_resetSignal.WaitOne( /*infinite*/);
}

关于c# - Timer(callback,...) 回调函数是否添加到堆栈?垃圾收集 Q 与此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com