定期运行方法

本文关键字:方法 运行 | 更新日期: 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协调