首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >第一次运行该函数的Timer.Interval

第一次运行该函数的Timer.Interval
EN

Stack Overflow用户
提问于 2013-06-01 14:22:24
回答 2查看 8.8K关注 0票数 5

我已经创建了一个Windows服务,我需要在其中每天执行任务。为此,我使用了Timer控件。

代码语言:javascript
代码运行次数:0
运行
复制
Timer tm = new Timer();
tm.Elapsed += new ElapsedEventHandler(OnElapsedTime);
tm.Interval = 86400000;

但这里的问题是,在我启动服务后,我必须等待整整1天才能真正调用该函数。

那么,有没有一种方法,在我启动服务的时候,函数就会被调用,而不必等到间隔时间结束?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-01 14:27:04

您可以先运行该方法,然后启动计时器。因此,它将进行第一次运行,计时器将在第二天再次运行。

或者创建简单的控制台应用程序来完成此任务。只需使用windows计划任务,您就可以每天运行此exe

另一种选择是在启动计时器后立即调用事件

How to fire timer.Elapsed event immediately

票数 6
EN

Stack Overflow用户

发布于 2013-06-01 15:02:48

有两种方法可以做到这一点。

1) OnElapsedTime中的代码,将其放入另一个方法中,并在启动计时器时立即调用该方法。例如,将代码放在TimerCalled方法中,然后使用以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
static void Main(string[] args)
{
    Timer tm = new Timer();
    tm.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    tm.Interval = 86400000;
    TimerCalled();
}

private static void OnElapsedTime(object source, ElapsedEventArgs e)
{
    TimerCalled();
}

2)您可以使用System.Threading.Timer类。你可以这样使用它:

代码语言:javascript
代码运行次数:0
运行
复制
System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 0, 86400000);

但请注意,System.Threading.Timer在单独的线程上运行。因此,任何从该线程更新UI elements的尝试都会导致错误。您应该通过Dispatcher或其他方式将UI元素更新(如果有)委托给UI线程。

更新:如果你想在服务启动几分钟后启动,你可以提供几分钟的延迟:

代码语言:javascript
代码运行次数:0
运行
复制
System.Threading.Timer tm = 
    new System.Threading.Timer(OnElapsedTime, null, 120, 86400000);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16869772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档