我有一个后台工作者,我正在用它来执行某项任务。它按预期工作。但是,我有一个计时器,我想添加并使其启动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; }));
它仍然不会发射。我很困惑,任何帮助或替代方案都将不胜感激。
答案 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();
}
}