为什么背景工作者永远不会参加完成的活动?

时间:2014-09-19 21:30:48

标签: c# .net winforms

在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事件中只将项目添加到listBox1一次。 但它一直在不停地做这件事。 如果我将使用休息;这里:

if (counter == 199)
                    {
                        counter = 0;
                        CloudEnteringAlert.ClearList();
                        //break;
                    }

它将进入已完成的事件并将停止。 但是我不想阻止backgorundworker我只想做一次listBox1只有一次当它到达199时不再继续添加到listBox1但是继续做另一个事情又来了。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望backgroundWorker1_DoWork代码继续运行,但是您希望在DoWork处理了199个项目时触发backgroundWorker1_RunWorkerCompleted事件。 “已完成”事件意味着DoWork代码已完成处理,而不是“完成某项操作”。我觉得TerryBozzio有一个很好的建议。调用ReportProgress以在第一次计数器== 199时触发ProgressChanged事件。