使用定时器在后台进程中执行功能
你好,我正试图实现这个功能,我有一个函数可以扫描我的数据库,并在一段时间后可能会返回一个特定的值5mins。这个函数应该在后台进程中运行,而不是以任何方式阻碍用户。我已经阅读了几篇关于“背景工作者”和“线程化”的文章,但是我想就如何实现这一点提供一些指导。使用定时器在后台进程中执行功能
如:
private void func()
{
MessageBox.Show("Hello World!");
}
现在我想这个功能,只要在应用程序运行,一切都应该在一个后台进程来完成每15分钟执行,而无需中断用户,直到最终被显示在消息框中。
下面的示例代码中使用: -
// 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
}
这实际上很有用,谢谢。 – 2014-08-28 12:42:14
很高兴它帮助..plz标记为答案,如果它是快速的@BlankEDjok – Neel 2014-08-28 13:27:14
尽管快速的问题,为什么我无法从这个事件中访问桌面控件? – 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);
}
}
可怕的想法。为什么通过长时间睡眠来锁定线程? – 2014-08-28 11:03:20
这是什么问题? @DanielKelley – 2014-08-28 11:13:03
我认为当你为你的内涵添加一些解释时,它对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
,并且不会妨碍用户体验。 (如果它当然不重)
这是一个糟糕的解决方案。为什么只创建一个线程才能让它休眠? – 2014-08-28 11:03:57
@DanielKelley我没有看到问题,你能指出吗? – KugBuBu 2014-08-28 11:04:41
你创建一个线程,然后把它放到睡眠 - 这是一种资源浪费。见Neels的答案 - 一个计时器更合适。 – 2014-08-28 11:06:13
有很多方法来实现您的要求。最简单的方法是在主窗体上使用Timer
和BackgroundWorker
组件。
在计时器的每个Tick
上,您会调用后台工作人员的RunWorkerAsync
方法。在DoWork
活动中做好你的事情,并在RunWorkerCompleted
中显示你的结果,这样你的申请就不会在MessageBox.Show
的kaboom里。
但是我如何在计时器的tick事件中执行后台工作者的do_work事件? – 2014-08-28 11:59:43
'RunWorkerAsync'可以做到这一点 – edokan 2014-08-28 14:24:29
使用计时器。网上有很多可用的资源。 – 2014-08-28 10:53:56
请注意[.NET中提供的不同定时器](http://msdn.microsoft.com/zh-cn/magazine/cc164015.aspx) – pinebit 2014-08-28 20:57:42