C#Background Worker仅在整个处理完成后报告进度

时间:2019-02-22 09:10:23

标签: c# .net

我的后台工作人员遇到此问题,该问题仅在我的任务完成后才触发,而在执行过程中不触发。我确保正确划分进度,但仍未触发。我不确定我还能做什么。

这是我的代码:

private int segmentHalf = 0;
private int segmentFull = 0;
public AutoMaticOne()
{
    InitializeComponent();
    backgroundWorker.WorkerReportsProgress = true;

}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var backgroundWorker = sender as BackgroundWorker;
    List<PrintObject> pol = new List<PrintObject>();

    var program = programsData.Get(programSelectionInput.Text);
    var fields = fieldsData.GetAllByTaskId(program.Id);
    pol = printerData.Load(Input, program.Name,fields,program.Delimiter);
    pol = pol.OrderBy(x => x.FilePath).ToList();
    if (pol != null)
    {
        for(int i =0;i<pol.Count();i++)
        {
            segmentHalf = (((i + 1) / pol.Count()) * 100) / 2;
            segmentFull = segmentHalf * 2;
            backgroundWorker.ReportProgress(segmentHalf);
            print.Process(pol[i].FilePath, pol[i].PrinterDriver);
            infoInput.Invoke((MethodInvoker)delegate {
                infoInput.Text = infoInput.Text + "\r\n" + pol[i].FileName + " - " + pol[i].PrinterDriver;
            });
            backgroundWorker.ReportProgress(segmentFull);
        }
    }
}

private void backgroundWorker_ProgressChanged(object sender,
            ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    ProgressBar.Value = e.ProgressPercentage;
    ProgressBarLabel.Text = e.ProgressPercentage + "%";
}

private void backgroundWorker_RunWorkerCompleted(object sender,
    RunWorkerCompletedEventArgs e)
{
    InputDirectory.Enabled = true;
    OutputDirectory.Enabled = true;
    InputDirectoryButton.Enabled = true;
    OutputDirectoryButton.Enabled = true;
    MessageBox.Show("Task has been Completed, Output files can be found at " + OutputDirectory.Text, "Task Completed");
    Start.Enabled = true;
}

当我从10个文件开始时,看起来还不错。但是,当它加载大约1000的内容时,它只会在最后报告进度。

SegmentHalf和Full在构造函数上方声明

1 个答案:

答案 0 :(得分:1)

只要i < pol.Count - 1(i + 1) / pol.Count将是0。整数除法将截断为0。您的代码将对除最后一个文件之外的所有文件执行0 * 100

您可以这样解决它:

//segmentHalf = (((i + 1) / pol.Count()) * 100) / 2;
  segmentHalf = (((i + 1) * 100) / pol.Count) / 2;