使用计时器在后台进程中执行函数

时间:2014-08-28 10:50:12

标签: c# .net multithreading

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

例如:

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

现在我希望这个函数每15分钟执行一次,只要应用程序正在运行,一切都应该在后台进程中完成,而不会中断用户,直到最终显示消息框。

4 个答案:

答案 0 :(得分:1)

使用以下示例代码: -

// 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 :(得分:1)

有许多方法可以实现您的要求。最简单的方法是在主表单上使用TimerBackgroundWorker组件。

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

答案 2 :(得分:0)

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

t.start();

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

答案 3 :(得分:0)

我不确定"不会以任何方式妨碍用户",但是:

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();
}

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