-1

ファイルからロードする膨大な量のデータと Windows フォーム コントロールがあり、ファイル サイズが非常に大きい場合は、プログレス バーを使用する必要があります。

プログレスバーは機能しますが、プログラムがデータを構築してフォームにロードし始めるとすぐにフリーズします。

それで、とにかく私はそれを機能させることができますか?プログレスバーと一緒にバックグラウンドワーカーを使用しています。

ここにいくつかのコードがあります:

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    try
    {
        listBox2.Items.Clear();
        listBox3.Items.Clear();
        dataGridView1.RowCount = 0;
        progressBar1.Visible = true;
        reading.Visible = true;
        backgroundWorker1.RunWorkerAsync();
        setLabels();
        progressBar1.Visible = false;
        reading.Visible = false;
    }
      }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        // Wait 100 milliseconds.
        Thread.Sleep(100);
        // Report progress.
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender,
   ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    // Set the text.
    reading.Text += " at " + e.ProgressPercentage.ToString() + "%";
}
4

2 に答える 2

1

読み込み作業は別のスレッドで行い、メイン スレッドで UI の更新を処理する必要があります。例えば:

次の方法で、処理するファイルでワーカーを開始できます。

bgWorker.RunWorkerAsync(object);

次に、実行時間の長いタスクを実行する DoWork メソッドを接続します。ここで、結果/進行状況バーのパーセンテージを UI に報告します。

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{     
      object myObject = (object)e.Argument;
      bgWorker.ReportProgress(//YOUR FORMULA TO WORK OUT PERCENTAGE);
}

への呼び出しは、以下を使用してバックグラウンド スレッドから UI を安全に更新できるイベントをReportProgress呼び出します。ProgressChanged

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
        progressBar.Value = e.ProgressPercentage;
}
于 2012-07-25T10:32:09.193 に答える
0

何かが UI スレッドの更新をブロックしているに違いありません。こうすれば

private void updateProgressBar(int パーセント)

    {
        if (ProgressBar.InvokeRequired)
        {
            updateProgressBarCallback cb = new updateProgressBarCallback(updateProgressBar);
            this.Invoke(cb, new object[] { percent });
        }
        else
        {
            ProgressBar.Value = percent;
            ProgressBar.Update();
            ProgressBar.Refresh();
            ProgressBar.Invalidate();
        }
    }
于 2013-10-04T08:52:53.987 に答える