使用定时器在后台进程中执行功能

问题描述:

你好,我正试图实现这个功能,我有一个函数可以扫描我的数据库,并在一段时间后可能会返回一个特定的值5mins。这个函数应该在后台进程中运行,而不是以任何方式阻碍用户。我已经阅读了几篇关于“背景工作者”和“线程化”的文章,但是我想就如何实现这一点提供一些指导。使用定时器在后台进程中执行功能

如:

private void func() 
{ 
    MessageBox.Show("Hello World!"); 
} 

现在我想这个功能,只要在应用程序运行,一切都应该在一个后台进程来完成每15分钟执行,而无需中断用户,直到最终被显示在消息框中。

+0

使用计时器。网上有很多可用的资源。 – 2014-08-28 10:53:56

+0

请注意[.NET中提供的不同定时器](http://msdn.microsoft.com/zh-cn/magazine/cc164015.aspx) – pinebit 2014-08-28 20:57:42

下面的示例代码中使用: -

// Create a 1 min timer 
    timer = new System.Timers.Timer(60000); 

    // Hook up the Elapsed event for the timer. 
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

    timer.Enabled = true; 


... 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    MessageBox.Show("Hello World!"); 
    // Your code 
} 
+1

这实际上很有用,谢谢。 – 2014-08-28 12:42:14

+0

很高兴它帮助..plz标记为答案,如果它是快速的@BlankEDjok – Neel 2014-08-28 13:27:14

+0

尽管快速的问题,为什么我无法从这个事件中访问桌面控件? – 2014-08-28 13:38:14

Thread t = new Thread(new ThreadStart(func)); 

t.start(); 

private void func() 
{ 
while(true) 
{ 
    MessageBox.Show("Hello World!"); 
    Thread.Sleep(5000); 
} 
} 
+0

可怕的想法。为什么通过长时间睡眠来锁定线程? – 2014-08-28 11:03:20

+0

这是什么问题? @DanielKelley – 2014-08-28 11:13:03

+0

我认为当你为你的内涵添加一些解释时,它对OP和更多访问者会更有帮助。 – reporter 2014-08-28 11:27:56

我不知道有关 “没有在所有任何方式妨碍用户”,而是:

public static Thread Schedule(Action action, int delaysecs) 
{ 
    return new Thread(new ThreadStart(() => 
    { 
     DateTime dateTime = DateTime.Now; 
     while (true) { 
      if (DateTime.Now > dateTime) 
      { 
       action(); 
       dateTime.AddSeconds(delaysecs); 
      } 
      Thread.Sleep(1000); //Adjust for accuracy 
     } 
    })).Start(); 
} 

此代码创建并返回保证每delaysecs秒执行action的线程。即使action需要超过一秒钟,它也不会延迟下一个action,并且不会妨碍用户体验。 (如果它当然不重)

+0

这是一个糟糕的解决方案。为什么只创建一个线程才能让它休眠? – 2014-08-28 11:03:57

+0

@DanielKelley我没有看到问题,你能指出吗? – KugBuBu 2014-08-28 11:04:41

+0

你创建一个线程,然后把它放到睡眠 - 这是一种资源浪费。见Neels的答案 - 一个计时器更合适。 – 2014-08-28 11:06:13

有很多方法来实现您的要求。最简单的方法是在主窗体上使用TimerBackgroundWorker组件。

在计时器的每个Tick上,您会调用后台工作人员的RunWorkerAsync方法。在DoWork活动中做好你的事情,并在RunWorkerCompleted中显示你的结果,这样你的申请就不会在MessageBox.Show的kaboom里。

+0

但是我如何在计时器的tick事件中执行后台工作者的do_work事件? – 2014-08-28 11:59:43

+0

'RunWorkerAsync'可以做到这一点 – edokan 2014-08-28 14:24:29