gpt4 book ai didi

c# - System.Threading.Timer 停止线程?

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

计时器能否通过从回调返回来停止正在运行的线程?

我需要一个计时器,它会在特定时间内运行一些功能。但是这个功能比定时器滴答持续时间更长。

_timer = new System.Threading.Timer(new TimerCallback(Process), null, TimeSpan.Zero, TimeSpan.FromHours(1));

和回调:

public void Process(Object stateinfo)
{
DateTime dt = DateTime.Now.ToUniversalTime();
//run once a day between 2 and 5 am
if (LastCheckDateTime == DateTime.Today || dt.ToString("HHmm").CompareTo("0200") < 0 || dt.ToString("HHmm").CompareTo("0500") > 0)
return;

try
{
LastCheckDateTime = DateTime.Today;
foo(); //lasts 4 hours
}
catch (Exception ex)
{
LastCheckDateTime = DateTime.MinValue;
//if some problems, Process must start again until 5 am
}
}

这段代码今天凌晨 2 点 56 分开始,但没有完成,这是因为凌晨 5 点它还在运行吗?

如何解决这个问题?

最佳答案

您的代码有效,您使用了我心目中最好的计时器 (System.Threading)。即使之前的调用未完成,重新执行相同的方法也没有问题。前一个实例没有被杀死。您只需要管理重入,但您这样做的方式可以防止出现问题(您的计时器每小时触发一次,因此在检查“LastCheckDateTime”的行和更改其值的行之间没有线程问题)。

我尝试了以下方法,效果很好:事件每秒触发一次,但“进程”在等待 3 秒后启动。

 public partial class MainWindow : Window
{
private System.Threading.Timer _timer;

public MainWindow()
{
InitializeComponent();
_timer = new Timer(new System.Threading.TimerCallback(Process), null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}

private void Process(object state)
{
DateTime dt = DateTime.Now;
System.Threading.Thread.Sleep(3000);
Debug.WriteLine("dt=" + dt.ToString("HH:mm:ss.fff") + " Now=" + DateTime.Now.ToString("HH:mm:ss.fff"));

}

}

最好的问候,

关于c# - System.Threading.Timer 停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26926195/

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