1

我有一个后台工作人员,我正在使用它来执行某些任务。它按预期工作。但是,我有一个计时器,我想添加它并让它启动 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");
                    }
                }
            }

我的后台工作人员异步在页面构造方法上,因此在加载时运行。就像下面

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


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

            }

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

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

它仍然不火。我很困惑,任何帮助或替代方法将不胜感激。

4

1 回答 1

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

}
于 2013-11-13T09:12:07.133 回答