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);
    }
}

しかし、リストをテキストボックスに何度も追加し続けるとうまくいきません。テキストボックスに次のように表示したい:

ダニエルこんにちは

ヤロンバイ

ダニー・グッド

しかも一度だけ。

もう 1 つのことは、For im が実行されていない場合、namesAndTexts.Count - 1エラーnamesAndTexts.Count例外がスローされ、namesAndTexts[f] のインデックスが 0 未満ではなく、リスト未満であってはならないということです....


これが機能した後、リストが変更されたかどうかを確認し、textBox で何らかの自動プッシュアップを行う必要があります。textBox をそのサイズまで行で埋め、一番下に到達したらスクロールアップを開始し、新しい行のみを更新し続けるようにします。下から古いものを上から押し上げます。

どうすればできますか?

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

Action ラムダ内に For ループを配置してみてください。もう 1 つの方法は、最初に Sum LINQ 関数を使用して文字列を合計し、その結果をテキスト ボックスに入力することです。

于 2012-08-11T20:59:47.060 に答える
0

ループ内でクロージャーを作成しようとしているようで、以下のコードが実際に実行されると:

textBox1.AppendText(namesAndTexts[f])

fラムダが作成された時点の値ではなく、 の現在の値を使用します。そのため、最後の要素が何度も追加されnamesAndTexts.Count - 1、境界チェックを使用しないと失敗します (の現在の値がfisであるためnamesAndTexts.Count)。

「ループ内の閉鎖」問題のより詳細な説明については、この質問も参照してください。fこれを回避する 1 つの方法は、変数をコピーすることです。

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 に答える