0

我有以下代码以异步方式更新进度条,我通过调用 MessageBox 注意到它的异步行为。在这种情况下,它工作得很好,但是当我休眠 1s(1000)时,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

Delegate.BeginInvoke将在线程中运行一次方法,然后将其释放。如果你想在一个线程中重复做一些工作并返回中间结果,这是一个糟糕的选择。如果这是你想要的,你应该使用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 回答
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 回答