C#Progressbar不会使用backgroundworker进行更新

时间:2009-11-24 09:11:16

标签: c# backgroundworker

我正在尝试使用backgroundworker更新我的进度条。只有这个不起作用。这是我的代码:

private BackgroundWorker _worker;

public Form1(string[] args)
{
    InitializeComponent();

    // Backgroundworker to update the progressbar
    _worker = new BackgroundWorker();
    _worker.WorkerReportsProgress = true;
    _worker.ProgressChanged += worker_ProgressChanged;
    _worker.DoWork += worker_DoWork;
    _worker.RunWorkerCompleted += worker_WorkCompleted;

}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    SendItems();
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}
private void worker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _running = false;
    HandleGui();
}

private bool SendItems()
{
    try
    {
        GetEvaluationDocumentsToSend();
        _worker.ReportProgress(16);

        GetModifiedEvaluationDocumentsToSend();
        _worker.ReportProgress(32);

        GetTasksToSend();
        _worker.ReportProgress(48);

        GetPostToSend();
        _worker.ReportProgress(64);

        GetContractDocumentsToSend();
        _worker.ReportProgress(80);

        GetModifiedContractDocumentsToSend();
        _worker.ReportProgress(100);

        return true;
    }
    catch (Exception e)
    {
        Log.WriteLog(e.ToString());

        MessageBox.Show(
            "The following error occured while sending the items: \r\n" + e.ToString(),
            "Error",
            MessageBoxButtons.OK,
            MessageBoxIcon.Exclamation);

        return false;
    }
}

private void btnUpdate_Click(object sender, EventArgs e)
{
    _worker.RunWorkerAsync();
}

我没有收到任何错误,但我的进度条不会更新。我做错了什么?

3 个答案:

答案 0 :(得分:3)

它适用于我的机器。 GetEvaluationDocumentsToSend()做了什么?也许它比其他方法花费的时间更长,所以看起来没有进展,因为所有的进展几乎是瞬间完成的?此外,HandleGui()做什么以及_running用于什么?

答案 1 :(得分:2)

您没有启动BackgroundWorker!

在事件订阅后添加此行:

_worker.RunWorkerAsync();

编辑: 现在代码显示您调用RunWorkerAsync()

尝试在每次进度后添加Thread.Sleep(1000)以查看您的进程是否过快......

答案 2 :(得分:0)

尝试围绕进度条更新添加Invoke / BeingInvoke调用:

this.BeginInvoke((MethodInvoker)delegate
{
    progressBar1.Value = e.ProgressPercentage;
});

这通常是UI没有更新的原因。