在DoWork的事件中,我所做的:爲什麼背景工作者永遠無法完成完成的事件?
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgw = (BackgroundWorker)sender;
distance = 0; counter = 0;
if (bgw.CancellationPending == true)
{
}
else
{
while (counter < 200)
{
counter += 1;
distance = (float)counter;
DateTime dt1, dt2;
dt1 = DateTime.Now;
CloudEnteringAlert.cloudalert(localbmp, distance);
dt2 = DateTime.Now;
TimeSpan ts = dt2 - dt1;
Logger.Write(ts.TotalMilliseconds.ToString());
if (counter == 199)
{
counter = 0;
CloudEnteringAlert.ClearList();
//break;
}
try
{
if (completed == true)
{
return;
}
else
{
this.Invoke(new Action(() =>
{
if (CloudEnteringAlert.cloudsfound == true)
{
listBox1.Items.Add("Cloud detected at: " + CloudEnteringAlert.cloudsdistance.Text + " Kilometers from the coast");
timesdetectedclouds += 1;
label2.Visible = true;
label2.Text = timesdetectedclouds.ToString();
}
else
{
listBox1.Items.Add("Cloud not detected at: " + CloudEnteringAlert.cloudsdistance.Text + " Kilometers from the coast");
timesnotdetectedclouds += 1;
label4.Visible = true;
label4.Text = timesnotdetectedclouds.ToString();
}
}));
}
}
catch (Exception err)
{
Logger.Write(err.ToString());
}
}
}
}
而在完成的事件我所做的:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
}
else if (!(e.Error == null))
{
}
else
{
string t = "Done!";
completed = true;
}
但它永遠無法與IF中完成的事件。
我想要做的一般是在DoWork事件中添加到列表框1的項目只有一次。但它一直在不停地做它。 如果我將使用Break;這裏:
if (counter == 199)
{
counter = 0;
CloudEnteringAlert.ClearList();
//break;
}
它會到達完成的事件並停止。 但我不想停止backgorundworker我只想做與listBox1的部分只有一次,當它達到199不要再繼續添加到listBox1,但繼續做其他事情再次。
ReportProgress將是非常好的...併除此之外,也許你有你的手無限循環...... remenber那個櫃檯和距離是從另一個線程,所以也許是一個競爭條件... – terrybozzio 2014-09-19 21:47:49