在C#中我想每30秒运行一次方法。例如,在while循环中,它将每30秒运行一次ReadData()。 ReadData出去收集数据,分析并存储它。
我理解Thread.Sleep会暂停线程和UI。几毫秒可能不是问题,但30秒肯定会。还有另一种方法可以做到这一点。
限制是必须使用.NET 4.0或更低版本运行应用程序。
答案 0 :(得分:2)
听起来你正在以固定的间隔进行某种轮询,这很容易用定时器实现,如我的示例中所述。 但是,要考虑的一件事是一般的轮询不必要的开销。作为替代方案,我想建议使用异步解决方案,而只需要在发生事件时对事件做出反应,而不是在固定的时间表上。 .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);
}
}
答案 1 :(得分:0)
使用Reactive Extensions,将ReadData方法放在后台线程中:
Install-Package Rx-Main
var subscription = Observable.Interval(TimeSpan.FromSeconds(30)).Subscribe(_=>{ ReadData(); });
当您不再需要它时,请将其丢弃。
答案 2 :(得分:0)
另外两个答案很棒,如果你正在寻找一些可以运行的东西,比如用户在程序中,并且我注意到你担心阻止UI线程,所以听起来像这就是情况,但只是为了记录,如果您正在寻找始终运行的东西,您可能需要查看内置的Windows任务调度服务。< / p>
同样,如果您只想每三十秒更新一次仪表板,那么绝对不是您的解决方案。但是,如果您担心更新数据库或服务器端的某些内容,那么您可能不应该使用在后台运行的任务来编写自己的服务,并且每30秒就会命中一次。让Windows协调是一件好事。