如何在特定时间启动BackgroundWorker?

时间:2011-06-09 11:55:02

标签: c# .net timer backgroundworker

我在给定的特定时间运行backgroundworker时遇到问题。

我的代码仅在一秒钟内运行背景工作。

我想在后台增加间隔时间。

我正在使用这行代码在按钮单击事件中运行背景:

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

然后在backgroundWorker1_DoWork

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    backgroundWorker1.CancelAsync();
}

最后在backgroundWorker1_RunWorkCompleted

private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

我希望连续运行背景,但每5秒钟或超过5秒。

如果有人能帮助我,我们将非常感激,

提前致谢。

6 个答案:

答案 0 :(得分:11)

<强>运行时

Timer类表示Timer控件,用于在运行时创建Timer。以下代码段在运行时创建一个Timer,设置其属性和事件处理程序。

Timer t = new Timer();   
t.Interval = 2000;    
timer1.Enabled = true;  
timer1.Tick += new System.EventHandler(OnTimerEvent);

事件处理程序代码如下所示。

private void OnTimerEvent(object sender, EventArgs e) 
{
     backgroundWorker1.RunWorkerAsync();
}

以下是演示:C# Timer Tutorial

检查msdn上的文档:http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

答案 1 :(得分:5)

您可以添加Timer设置您希望后台工作程序运行的频率的时间间隔,以及可以启动后台工作程序的计时器已过去的事件。

在尝试再次启动后,您将需要检查后台工作程序是否处于忙碌状态。如果出现这种情况,那么您可能会考虑在完成后立即再次启动后台工作程序。 (如果你希望它每5秒运行一次)

如果您希望它在完成后等待5秒,那么您需要在启动后台工作程序之前停止计时器,然后在后台工作程序完成事件中,您需要重置计时器并重新启动它。

修改

在你的下面的一条评论之后,似乎你有很多后勤工作者,在这种情况下使用其他方法之一,在再次启动后台工作者之前在后台工作人员完成事件中插入延迟可能是一个更好的解决方案。

您可以按照建议使用Thread.Sleep()插入延迟,也可以在函数中创建一个计时器,并为重新启动后台工作程序的计时器已过时事件分配一个委托。沿着这些(未经测试的)线的东西:

private void backgroundWorker1_RunWorkerCompleted(object sender,     RunWorkerCompletedEventArgs e)
{
    Timer timer = new Timer();
    timer.Interval = 5000;
    timer.Enabled = true;
    timer.Elapsed+=delegate (object sender, ElapsedEventArgs args)
        {
        backgroundWorker1.RunWorkerAsync();        
        };
    timer.Start ();
}

答案 2 :(得分:2)

最简单的解决方案是让线程在backgroundWorker1_DoWorkThead.Sleep(5000)的开头睡眠5秒钟。

或者,您可以在RunWorkerCompleted中设置一个在5秒后到期的计时器,然后再次启动BackgroundWorker。

答案 3 :(得分:2)

您是否需要它完全每五秒运行不超过五秒?如果是后者,您可以在Sleep(5000)完成其Thread.CurrentThread方法之前在BackgroundWorker上致电DoWork()

答案 4 :(得分:2)

如果你想使用BW,试试这个:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Thread.Sleep(5000);//wait for 5s then run it again
    backgroundWorker1.RunWorkerAsync();
}

答案 5 :(得分:1)

您是否无法使用Timer来启动BackgroundWorker