0

進行状況バーを非同期で更新する次のコードがあり、MessageBox への呼び出しを通じてその非同期動作に気付きました。完全なプログレス バーが一度にいっぱいになります。なぜこれが起こっているのか教えてください。

 private void button1_Click(object sender, EventArgs e)
    {
        Update_Async async = new Update_Async(Update_Async_method);
        progressBar1.BeginInvoke(async,10);
        MessageBox.Show("Updation In Progress");


    }

    public void Update_Async_method(int a)
    {
        this.progressBar1.Maximum = a;
        for (int i = 1; i <= a; i++)
        {
            progressBar1.Value = a;
            Thread.Sleep(10);

     //Thread.Sleep(1000);

        }
    }
4

2 に答える 2

0

Update_Async.BeginInvoke(async, 10)デリゲートを非同期で実行したい場合は代わりに試してください。ただし、進行状況バーへの更新をクロススレッド チェックする必要があります。


あなたのコメントに応えて、あなたがすでにやっていることと非常によく似ていますが、

void UpdatingFunction(int value)
{
    if (this.progressBar.InvokeRequired)
    {
        this.progressBar.BeginInvoke(UpdatingFunction, value);
        return;
    }

    // Invoke not required, work on progressbar. 
}

Invokeこれは、コントロールのメソッドが何のためにあるのかについても説明しています。

于 2013-07-04T13:46:27.293 に答える
0

Delegate.BeginInvokeスレッドでメソッドを 1 回実行してから破棄します。スレッドで何らかの作業を繰り返し実行し、中間結果を返したい場合、これは適切な選択ではありません。それが必要な場合は、を使用する必要がありますBackgroundWorker。非常に省略されたスニペット:

BackgroundWorker bw;

YourFormConstructor()
{
    ...
    bw = new BackgroundWorker();
    bw.WorkerReportsProgress = true;
    bw.DoWork += BackgroundCalculations;
    bw.ProgressChanged += ShowBackgroundProgress;
}

private void button1_Click(object sender, EventArgs e)
{
  bw.RunWorkerAsync(10);
}

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

static void BackgroundCalculations(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bw = sender as BackgroundWorker;

    int max = (int)e.Argument;
    for (int i = 0; i < max; i++)
    {
        bw.ReportProgress(i * 100 / max);
        Thread.Sleep(10);
    }

    bw.ReportProgress(100);
    }
}
于 2013-07-04T19:20:47.123 に答える