2

データベースを更新しているWindowsプログラムがあります。進捗状況を表示したい2つのループがあります。最初のループは顧客のリストを取得し、2番目のループはその顧客の場所のリストを取得します。

DataTable dtCustomers = GetAllCustomers();

foreach(DataRow customer in dtCustomers.Rows)
{
    //update Customer Progressbar...

    //do some updating here...

    DataTable dtLocations = GetAllLocations(customer);

    foreach(DataRow location in dtLocations.Rows)
    {
        //do some updating here...

        //update Location Progressbar...
    }

    //reset Location Progressbar...
}

だから私がやりたいのは、各ループの視覚的なプログレスバー(pb)を表示することです。顧客pbは、処理された顧客ごとに増加し、場所pbも増加します...唯一の違いは、場所に基づいて更新に時間がかかる/短くなる可能性があるため、場所pbが各場所の後にリセットされることです。

私は1人のバックグラウンドワーカーから始めて、顧客のpbをうまく更新することができました。次のコードを「スタート」ボタンに入れました。

private void buttonStart_Click(object sender, EventArgs e)
{
    workerCustomers.RunWorkerAsync();
}

そして、workerCustomerのDoWork()イベントに、2つのループを配置します。「クロススレッド参照」エラーが発生するため、場所pbが更新されないことはわかっています。では、どうすれば自分のやりたいことをやることができますか?2つのbgワーカーをフォームに配置して、一方を他方から呼び出そうとしましたが、最初のワーカーがビジーであることを示す別のエラーが発生しました。

4

1 に答える 1

4

進行状況を報告するときに、追加のuserStateオブジェクトを2番目のパラメーターとして渡すことができます(ReportProgressメソッドの定義を参照)。

workerCustomers.ReportProgress(percentage1, percentage2);

また、ProgressChangedイベントハンドラーでは、両方のprogressBarを更新できます。

void workerCustomers_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage; // Customers
    progressBar2.Value = (int)e.UserState; // Locations
}

更新:あなたのケースでそれをどのように使用することができますか

DataTable dtCustomers = GetAllCustomers();
int customerIndex = 0;

foreach(DataRow customer in dtCustomers.Rows)
{
    //do some updating here...
    int customerPercentage = ++customerIndex * 100 / dtCustomers.Rows.Count;
    workerCustomers.ReportProgress(customerPercentage, 0);

    int locationIndex = 0;
    DataTable dtLocations = GetAllLocations(customer);

    foreach(DataRow location in dtLocations.Rows)
    {
        //do some updating here...
        int locationPecentage = ++locationIndex * 100 / dtLocations.Rows.Count;
        workerCustomers.ReportProgress(customerPercentage, locationPecentage);
    }

    workerCustomers.ReportProgress(customerPercentage, 0);
}
于 2012-10-24T20:52:25.467 に答える