【问题标题】:How to start a BackgroundWorker on a specific time?如何在特定时间启动 BackgroundWorker?
【发布时间】:2011-06-09 11:55:02
【问题描述】:

我在给定特定时间运行后台工作程序时遇到问题。

我的代码只需一秒钟即可运行 backgoundworker。

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

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

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 秒。

如果有人可以帮助我,将不胜感激,

提前致谢。

【问题讨论】:

  • 使用计时器?我不确定我是否理解您的问题,您能详细说明一下吗?
  • 我知道使用计时器,但我想使用背景。有没有办法在后台使用时间间隔
  • 为什么在 DoWork() 方法中使用 CancelAsync?
  • 定时器使用他们自己的线程,所以这不会持有你的程序,使用定时器,然后从定时器调用你的后台工作人员
  • 如果您获得了所需的信息,请将答案标记为已接受

标签: c# .net timer backgroundworker


【解决方案1】:

运行时

Timer 类表示一个 Timer 控件,用于在运行时创建一个 Timer。以下代码 sn-p 在运行时创建一个 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

【讨论】:

  • 您的回答很好,但我无法投票给您,因为我只有 10 个声誉,抱歉
  • 我认为 System.Timers.Timer 没有 Tick 事件。而是使用 Elapsed。
【解决方案2】:

您可以添加一个Timer,将间隔设置为您希望后台工作人员运行的频率,并在计时器经过的事件上启动您的后台工作人员。

您需要在尝试再次启动它之前检查后台工作人员是否不忙。如果发生这种情况,那么您可能会考虑在后台工作程序完成后立即再次启动它。 (如果您希望它至少每 5 秒运行一次)

如果你想让它在完成后等待5秒,那么你需要在启动后台worker之前停止定时器,然后在后台worker完成事件中你需要重置定时器并重新启动它。

编辑

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

您可以按照建议使用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 ();
}

【讨论】:

    【解决方案3】:

    您需要它恰好每五秒运行一次还是不超过五秒?如果是后者,您可以在 BackgroundWorker 完成其 DoWork() 方法之前在 Thread.CurrentThread 上调用 Sleep(5000)

    【讨论】:

    • 您的回答很好,但我无法投票给您,因为我只有 10 个声誉,抱歉
    • @G Basha - 谢谢..我相信你可以在 15 声望时投票,除非你已经用完了当天所有的投票。
    【解决方案4】:

    最简单的解决方案是在backgroundWorker1_DoWork:Thead.Sleep(5000)的开头让线程休眠5秒。

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

    【讨论】:

    • 你的回答很好,但我无法投票给你,因为我只有 10 个声望,对不起
    【解决方案5】:

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

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

    【讨论】:

    • 您的回答很好,但我无法投票给您,因为我只有 10 个声誉,抱歉
    • 我应该挂我的应用程序
    • 欢迎您,您可以通过接受其他问题的答案来帮您一个忙。你问了 8 个问题,但没有一个得到好的答案?
    • 移动线程.Sleep(5000);在 backgroundWorker1.CancelAsync() 之前;在 DoWork 方法中不要像 Yuck 提到的那样挂起您的应用程序
    【解决方案6】:

    您不能使用Timer 来启动您的BackgroundWorker 吗?

    【讨论】:

    • 是的,我可以,但它有超过 20 个后台工作人员在里面
    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多