计时器滴答事件不会在后台工作者do_work中触发

时间:2013-11-13 05:33:11

标签: c# timer backgroundworker

我有一个后台工作者,我正在用它来执行某项任务。它按预期工作。但是,我有一个计时器,我想添加并使其启动bw并计算页面加载后10秒。我将timer.Interval设置为10000.计时器有一个滴答事件,如下所示

 private DateTime dateETA;
    private void TimerEventHandler(object sender, EventArgs e)
            {
                while (bw.CancellationPending ==false)
                {
                    if (timerPro.Enabled == true)
                    {
                         dateETA = Convert.ToDateTime("1/1/0001 00:00:00");
                        dateETA = dateETA.AddMilliseconds(timerPro.Interval);
                        lblETA.Visible = true;
                        lblETA.Text = "Elapsed Time : " + Convert.ToString(dateETA.TimeOfDay);
                       // SetText("timer");
                    }
                }
            }

我的后台工作程序async位于页面构造方法上,因此在加载时运行。就像下面一样

  if (bw.IsBusy != true)
            {
                this.btnPause.Enabled = true;
                this.btnStop.Enabled = true;
                btnStart.Enabled = false;


               // timerPro.Start();
                bw.RunWorkerAsync();

            }

我想和我的任务一起启动计时器,因此我把它放在我的bw.async之前。然后我意识到当在后台工作者的dowork方法之前或之内放置时,计时器刻度事件不会触发。我认为可能是bw线程阻止事件被触发然后我在dowork中使用如下所示的调用方法尝试启动计时器或触发计时器的tick事件。

 this.Invoke((MethodInvoker)(() => { timerPro.Enabled = true; }));

它仍然不会发射。我很困惑,任何帮助或替代方案都将不胜感激。

1 个答案:

答案 0 :(得分:3)

我认为你只想要一个正在运行的计时器,而后台工作者会做它的事情?

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();

    private void Form1_Load(object sender, EventArgs e)
    {
        timerPro.Interval = 1000;
        timerPro.Tick +=new EventHandler(TimerEventHandler);
        SW.Start();
        timerPro.Start();
        bw.RunWorkerAsync();
    }

    private void TimerEventHandler(object sender, EventArgs e)
    {
        lblETA.Visible = true;
        TimeSpan TS = SW.Elapsed;
        string elapsed = String.Format("{0}:{1}:{2}", TS.Hours.ToString("00"), TS.Minutes.ToString("00"), TS.Seconds.ToString("00"));
        lblETA.Text = "Elapsed Time : " + elapsed;
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // ... do some work ...
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        timerPro.Stop();
    }

}