定期运行方法
本文关键字:方法 运行 | 更新日期: 2023-09-27 18:12:07
在c#中,我想每30秒运行一个方法。例如,在while循环中,它将每30秒运行一次ReadData()。ReadData出去收集数据,分析并存储数据。
我理解那个线程。Sleep将暂停线程和UI。这在几毫秒内可能不是问题,但在30秒内肯定会。还有别的办法吗?
限制是应用程序必须使用。net 4.0或更低版本运行。
这听起来像你正在做某种轮询在一个固定的间隔,这是很容易实现与定时器在我下面的例子中描述的。然而,需要考虑的一件事是轮询的不必要开销。作为一种替代方案,我想建议采用异步解决方案,您只需要在事件发生时做出反应,而不是按照固定的时间表进行反应。在。net领域中,一个典型的实现是基于队列的系统,而NServiceBus是一个很棒的产品,它使这一切变得非常容易。
无论如何,下面是定时器代码:
下面是一个来自msdn 的定时器示例http://msdn.microsoft.com/en-us/library/system.timers.timer (v = vs.110) . aspx
public class Example
{
private static Timer aTimer;
public static void Main()
{
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program... ");
Console.ReadLine();
Console.WriteLine("Terminating the application...");
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
}
使用响应式扩展,将ReadData方法放在后台线程中:
Install-Package Rx-Main
var subscription = Observable.Interval(TimeSpan.FromSeconds(30)).Subscribe(_=>{ ReadData(); });
当你不再需要它时,处理它。
另外两个答案是很好的,如果你在寻找一些东西会运行,比如说,一个用户在程序上,我注意到你担心阻塞UI线程,听起来是这样,但只是为了记录如果你在寻找一些东西总是运行,你可能想看看内置的Windows任务调度服务。
再次强调,如果你只想每30秒更新一次仪表板,这绝对不是你的解决方案。但是,如果您担心更新数据库或服务器端内容,那么您可能不应该编写自己的服务,让任务在后台运行,每30秒触发一次。这是一个更好的事情,让Windows协调