0
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{
    BackgroundWorker worker = sender as BackgroundWorker;
    while (true)
    {

        if ((worker.CancellationPending == true))
        {
            e.Cancel = true;
            break;
        }
        else
        {



            string content = downloadContent();
            GetProfileNames(content);
            GetTextFromProfile(content);
            for (int i = 0; i < names.Count; i++)
            {
                 namesAndTexts.Add(names[i] + " " + texts[i]);
            }
            if (InvokeRequired)
            {
                for (int f = 0; f < namesAndTexts.Count -1; f++)
                {
                    BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
                }
            }
            reader.Close();
            response.Close();
            Thread.Sleep(1000);
        }
    }
}

我试过这部分:

if (InvokeRequired)
{
    for (int f = 0; f < namesAndTexts.Count -1; f++)
    {
        BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
    }
}

但它不能很好地继续将列表一遍又一遍地添加到文本框中。我想在文本框中看到它:

丹尼尔你好

亚龙再见

丹尼·古德

而且只有一次。

另一件事是,如果在 For im 没有做namesAndTexts.Count - 1但是namesAndTexts.Count它抛出错误异常 namesAndTexts[f] 索引不应该小于零但小于列表....


在这将起作用之后,我需要检查列表是否已更改,并以某种方式在文本框中自动向上推,让我们说用线条将文本框填充到其大小,当它到达底部时开始向上滚动并继续更新新行从底部abnd将旧的从顶部向上推。

我该怎么做?

4

4 回答 4

1

替换这些行:

for (int f = 0; f < namesAndTexts.Count -1; f++)
{
     BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
}

用这些:

textBox1.Clear();
namesAndTexts.ForEach(Item=> textBox1.AppendText(Item + Environment.NewLine));
于 2012-08-11T20:57:06.000 回答
0

尝试将 For 循环放在 Action lambda 中。另一种方法是首先使用 Sum LINQ 函数对字符串求和,然后将结果放入文本框中。

于 2012-08-11T20:59:47.060 回答
0

似乎您正试图在循环内创建一个闭包,并且当下面的代码实际执行时:

textBox1.AppendText(namesAndTexts[f])

它将使用 的当前值f,而不是创建 lambda 时的值。这就是为什么它一遍又一遍地添加最后一个元素,如果你不使用边界检查失败(因为isnamesAndTexts.Count - 1的当前值)。fnamesAndTexts.Count

有关“闭环内循环”问题的更详细说明,另请参阅此问题。避免它的一种方法是复制您的f变量:

for (int f = 0; f < namesAndTexts.Count; f++)
{
    int fcopy = f;
    BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[fcopy])), null);
}
于 2012-08-11T21:00:20.550 回答
0

因为这个而重复:

        while (true)
        {

               reader.Close();
                response.Close();
                Thread.Sleep(1000);
            }
        }
    }

此外,您可以在此之前执行“textBox1.Clear”:

                        for (int f = 0; f < namesAndTexts.Count -1; f++)
                        {
                            BeginInvoke(new Action(() => textBox1.AppendText(namesAndTexts[f])), null);
                        }
于 2012-08-11T21:02:17.497 回答