Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么backgroundworker永远无法完成活动?_C#_.net_Winforms - Fatal编程技术网

C# 为什么backgroundworker永远无法完成活动?

C# 为什么backgroundworker永远无法完成活动?,c#,.net,winforms,C#,.net,Winforms,在嫁妆活动中,我做到了: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bgw = (BackgroundWorker)sender; distance = 0; counter = 0; if (bgw.CancellationPending == true)

在嫁妆活动中,我做到了:

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的部分不要再继续添加到listBox1,而是继续做其他事情。

如果我理解正确,您希望backgroundWorker1\u DoWork代码保持运行,但希望backgroundWorker1\u RunWorkerCompleted事件在DoWork处理199个项目时触发。“Completed”事件意味着DoWork代码已完成处理,而不是“done do something”。我觉得TerryBozzio有个好建议。调用ReportProgress以触发ProgressChanged事件first time counter==199。

ReportProgress将非常好……除此之外,可能您的手上有一个无限循环……请记住,计数器和距离来自另一个线程,因此可能是一个竞赛条件……codeMethod我想制作listBox1。添加一次part。无论它是否到达完成的事件,我需要它只执行listBox1部分一次。剩下的就不停地走。当counter==199时,我希望它不会再次成为listBox1的一部分,而会一次又一次地不间断地完成其余部分。问题是如何一次性生成listBox1部件。我使用了报告进度,它正在到达完成的事件,但随后一切都停止了;。。。您是否可以更改为if(completed==true)continue;