0

この場合、progressBar は実際の Dowork の進行状況よりも速く移動し、progressChanged イベントで、progressBar の値が 100% を超えているという例外をスローします。

private List<string> webCrawler(string url, int levels , DoWorkEventArgs eve)
        {
            bool already = false;
                HtmlAgilityPack.HtmlDocument doc;
                HtmlWeb hw = new HtmlWeb();
                List<string> webSites;// = new List<string>();
                List<string> csFiles = new List<string>();

                csFiles.Add("temp string to know that something is happening in level = " + levels.ToString());
                csFiles.Add("current site name in this level is : " + url);
                                try
                {
                    doc = hw.Load(url);
                    webSites = getLinks(doc);


                    if (levels == 0)
                    {
                        return csFiles;
                    }
                    else
                    {

                        int actual_sites = 0;
                        for (int i = 0; i < webSites.Count() && i < 20; i++)                         {
                            if ((worker.CancellationPending == true))
                            {
                                eve.Cancel = true;
                                break;
                            }
                            else
                            {

                                string t = webSites[i];
                                                                if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) // replace this with future FilterJunkLinks function
                                {
                                    for (int e = 0; e < csFiles.Count; e++)
                                    {
                                        if (csFiles[e].Contains(t))
                                        {
                                            already = true;

                                        }
                                    }

                                    if (!already)
                                    {
                                        actual_sites++;
                                        csFiles.AddRange(webCrawler(t, levels - 1,eve));
                                        this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, "Level Number " + levels + " " + t + Environment.NewLine, Color.Red); }));
                                        worker.ReportProgress(i * 10);
                                                                            }

                                }
                            }
                        }

                        return csFiles;
                    }



                }
                catch
                {
                    return csFiles;
                }

        }




        public void Texts(RichTextBox box, string text, Color color)
        {
            box.SelectionStart = box.TextLength;
            box.SelectionLength = 0;

            box.SelectionColor = color;
            box.AppendText(text);
            box.SelectionColor = box.ForeColor;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            worker = sender as BackgroundWorker;
            webCrawler(guys, 2,e);
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;

        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        } 

DoWork イベントで DoWorkEventsArgs の変数 e を渡したので、操作をキャンセルする必要がある場合は、webCrawler 関数でワーカー変数を使用できます。webCrawler では、それを DoWorkEventArgs 前夜と呼んでいます。

問題は、progressBar へのレポートが正しい方法ではないことです。

reportprogress を次のように試しました。

for (int i = 0; i < webSites.Count() && i < 20; i++)                         {
                            double incPercent = (1 / webSites.Count()); 
                            if ((worker.CancellationPending == true))
                            {
                                eve.Cancel = true;
                                break;
                            }
                            else
                            {

                                string t = webSites[i];
                                                                if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) // replace this with future FilterJunkLinks function
                                {
                                    for (int e = 0; e < csFiles.Count; e++)
                                    {
                                        if (csFiles[e].Contains(t))
                                        {
                                            already = true;

                                        }
                                    }

                                    if (!already)
                                    {
                                        actual_sites++;
                                        csFiles.AddRange(webCrawler(t, levels - 1,eve));
                                        this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, "Level Number " + levels + " " + t + Environment.NewLine, Color.Red); }));
                                        worker.ReportProgress(i * (int)incPercent);
4

1 に答える 1

0
worker.ReportProgress(i * 10);

i > 10 (つまり、10 ページを超える) がある場合は常に、プログレス バーが 100% を超えています。

あなたが本当にパーセンテージでそれをやりたいのなら、私は次のようにします:

double incPercent = (1 / webSites.Count())

.
.
.
.
worker.ReportProgress(i * incPercent );

補足として、変数名と間隔が少しずれているようです

編集: 申し訳ありませんが、2 つの数値の除算を実行し、結果を double にしたい場合は、除数または被除数の型が double であることを確認する必要があります。それ以外の場合は、 int / int を効果的に実行しているため、 int が返されます。おそらくご存知のように、int は小数点を切り捨てます。これが、計算でゼロになった理由です。

また、reportProgress メソッドは 0 から 100 までの値を取るため、最終結果に 100 を掛ける必要があります。

次のようにコードを修正します。

double incPercent = (1 / (double)webSites.Count())

.
.
.
.
worker.ReportProgress(i * incPercent * 100 );
于 2012-09-12T04:42:08.587 に答える