2

バックグラウンドワーカープロセスをフォームで作成します..

 BackgroundWorker bw = new BackgroundWorker
        {
            WorkerReportsProgress = true,
            WorkerSupportsCancellation = true
        };  

また、フォーム内に進行状況バー コントロールがあります (進行状況バーの最小値と最大値は 1 と 100 です)。

私のボタンクリックでは、

クリックイベントがバックグラウンドで並行して実行されるはずの実際のメソッド呼び出しを開始する場所で、プログレスバーのステップの表示を開始します....

if (bw.IsBusy)
 {
    return;
 }

 bw.DoWork += (bwSender, bwArg) =>
 {
   MethodCall1(); - Does some database insertions..
   MethodCall2(); - Does some database select...
 }

bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);

bw.RunWorkerCompleted += (bwSender, bwArg) =>
{

  bw.Dispose();                  
};

bw.RunWorkerAsync();

プログレスバーに進行状況を表示するには...

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   progressBar.Value = e.ProgressPercentage;
}

私が直面している問題は、進行状況バーがステップしていない、静止しており、進行状況バーの進行状況がないことです。

また、実際のメソッドに bw.ReportProgress(integervalue) を挿入しようとしましたが、役に立ちませんでした。

バックグラウンド ワーカー スレッドでメソッド呼び出しを処理し、進行状況バーの進行状況を並行して表示するにはどうすればよいですか。メソッド呼び出しが完了した後、進行状況バーのステップを終了したいと考えています。

4

1 に答える 1

2

コメントで他の人が述べたように、イベントの配線をフォームコンストラクターまたは初期化メソッドに移動する必要があります。ボタンをクリックするたびにそれらを BackgroundWorker に追加すると、メソッドは 2 回目のクリックで 2 回、3 回目のクリックで 3 回実行されます。

DoWork コードのメソッド呼び出しの直後に ReportProgress 呼び出しを配置し​​てみてください。Hans が上で述べたように、メソッドの呼び出しにかかる時間を相互に比較して十分に把握していない限り、これは実際には進行状況を正確に表したものにはなりません。

Dispose に関しては、BackgroundWorker は IDisposable を実装する Component から継承します。ただし、BackgroundWorker は基本実装をオーバーライドして実際に何かを破棄するわけではないため、それを呼び出すと単にコンポーネント コレクションから削除されます。明示的に呼び出す必要はありません。

次のようなことを試してください:

public partial class Form1 : Form
{
    BackgroundWorker bw = new BackgroundWorker
    {
        WorkerReportsProgress = true,
        WorkerSupportsCancellation = true
    };  

    public Form1()
    {
        InitializeComponent();

        bw.DoWork += (bwSender, bwArg) =>
        {
            //MethodCall1(); - Does some database insertions..
            bw.ReportProgress(50);
            //MethodCall2(); - Does some database select...
            bw.ReportProgress(100);
        };

        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);

        bw.RunWorkerCompleted += (bwSender, bwArg) =>
        {

        };
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (bw.IsBusy)
        {
            return;
        }

        bw.RunWorkerAsync();
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
}
于 2013-10-19T04:29:36.370 に答える