Updating a status on a Winform in BackgroundWorker

2019-08-24 14:09发布

I have a multi-step BackgroundWorker process. I use a marquee progress bar because several of these steps are run on a iSeries server so there isn't any good way to determine a percentage. What I am envisioning is a label with updates after every step. How would you recommend updating a label on a winform to reflect each step?

Figured I would add a bit more. I call some CL and RPG programs via a stored procedure on an iSeries (or IBM i or AS/400 or a midrange computer running OS/400... er... i5/OS (damn you IBM for not keeping the same name year-to-year)).

Anyway I have to wait until that step is fully complete before I can continue on the winform side. I was thinking of sending feedback to the user giving the major steps.

  1. Dumping data to iSeries
  2. Running month-end
  3. Creating reports
  4. Uploading final results

I probably should have given this in the beginning. Sorry about that. I try to keep my questions general enough for others to make use of later rather than my specific task.

2条回答
我只想做你的唯一
2楼-- · 2019-08-24 14:10

How many steps is there? If there's 10 steps, simply use 10% step up marker for the end of each step that completed successfully.

查看更多
Luminary・发光体
3楼-- · 2019-08-24 14:35

This is one of the points of a background worker in essence. Use a ProgressBar and just determine how far along the progress is, according to your algorithm.

(As has been mentioned, if they're 10% through, send 10, if they're 50% through, send 50)

Using a BackgroundWorker bgWrk

Add the following event:

bgWrk.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(bgWrk_ProgressChanged);
// Note: This method is invoked on the UI thread

void bgWrk_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    // Add progress to whatever UI element needs updating. The below simply uses a progress bar.
    prog.Value = e.ProgressPercentage;
}

After each major step that you think deserves a user updates do the following:

bgWrk.ReportProgress(intValue);

A couple of notes:

  • You can pass an Object as well in the ReportProgress() method, so you would be able to update a label with a string object etc, however a progress bar is still the universal symbol of "hold on, i'm doing something"

  • If you have any indeterminate polling, and you are using a ProgressBar, try use it as an Indeterminate ProgressBar, or a spinner or such. WPF has a built in property to make a progress bar indeterminate which is useful.

查看更多
登录 后发表回答