C# 定期运行一个方法

C# 定期运行一个方法,c#,.net,timer,delay,C#,.net,Timer,Delay,在C#中,我希望每30秒运行一次方法。例如,在while循环中,它每30秒运行一次ReadData()。ReadData用于收集、分析和存储数据 我理解这个线程。睡眠会暂停线程和UI。这在几毫秒内可能不是问题,但在30秒内肯定会。还有别的办法吗 限制是应用程序必须使用.NET 4.0或更低版本运行。听起来您是在以固定的时间间隔进行某种轮询,这很容易用计时器实现,如下面的示例所述。 然而,需要考虑的一件事是,一般而言,不必要的轮询开销。作为替代方案,我建议使用异步解决方案,您只需要在事件发生时做出

在C#中,我希望每30秒运行一次方法。例如,在while循环中,它每30秒运行一次ReadData()。ReadData用于收集、分析和存储数据

我理解这个线程。睡眠会暂停线程和UI。这在几毫秒内可能不是问题,但在30秒内肯定会。还有别的办法吗


限制是应用程序必须使用.NET 4.0或更低版本运行。

听起来您是在以固定的时间间隔进行某种轮询,这很容易用计时器实现,如下面的示例所述。 然而,需要考虑的一件事是,一般而言,不必要的轮询开销。作为替代方案,我建议使用异步解决方案,您只需要在事件发生时做出反应,而不需要按照固定的时间表。在.Net领域中,这方面的一个典型实现是基于队列的系统,而NServiceBus是一个非常简单的产品

无论如何,下面是计时器代码:

下面是来自msdn的计时器示例


使用反应式扩展,将ReadData方法放置在后台线程中:

Install-Package Rx-Main

var subscription = Observable.Interval(TimeSpan.FromSeconds(30)).Subscribe(_=>{ ReadData(); });

当你不再需要它时,就把它处理掉。

如果你想在用户在程序上运行的时候寻找一些东西,那么其他两个答案是很好的,我注意到你担心会阻塞UI线程,所以听起来像是这样,但是如果你想找一些一直运行的东西,那就记录一下,您可能需要查看内置的Windows任务调度服务


再说一次,如果你只是想,比如说,每30秒更新一次仪表板,那肯定不是你的解决方案。但是,如果您担心更新数据库或服务器端的东西,那么您可能不应该在后台运行任务并每30秒点击一次的情况下编写自己的服务。让Windows协调是一件更好的事情。

为什么不使用计时器?使用计时器。如果需要,请将其与信号量结合起来,以防止多个并行操作。请不要只要求我们为您解决问题。向我们展示你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“”,以获得一篇您确实需要阅读的优秀文章。我确实使用了Thread.Sleep,但它通常会锁定我的UI。有几个选项@emodernoket更新了另一个选项-队列:-)非常感谢您提供的示例和链接。我还将看看你关于在事件发生时作出反应的其他建议。我不认为这是一个选择,但它可以工作。再次感谢您,当您只需要一个计时器时,安装一个新的软件包似乎有点过头了……而不是当它用于此用途和其他用途时。
Install-Package Rx-Main

var subscription = Observable.Interval(TimeSpan.FromSeconds(30)).Subscribe(_=>{ ReadData(); });