如何在从 returns 集合的方法获取数据时调用后台 progressChanged

How to call Background progressChanged while getting data from method which returns collection

我有检索数据的方法。我在后台工作人员 DoWork 中调用该方法。我想在 UI 上显示进度。如何以百分比显示进度(执行方法从 0 到 100 所用的时间)。这样我就可以使用 bgWorker_ProgressChanged

报告进度
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    MyCollection = GetReportData();            
}

首先,您必须指定您希望能够报告进度:

bgWorker.WorkerReportsProgress = true;

然后,修改您的 DoWork 事件以实际报告进度。您目前正在一次获取所有数据,这不利于显示进度 因为您正在获取数据。

您需要将 GetReportData() 分解成易于管理的部分。

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var bg = (BackgroundWorker)sender;

    var myCollection = new List<SomeClass>();

    while(/* somehow test whether there's more data to get */)
    {
        myCollection.AddRange(GetSomeMoreReportData());

        bg.ReportProgress(0);  // or pass a valid "percentage" if you can calculate it
    }

    // Don't access the UI from a background thread.
    // The safest thing you can do is pass the final data to the RunWorkerCompleted event
    e.Result = myCollection;
}

void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // You're back in the UI thread, update your ProgressBar
}

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    List<SomeClass> result = (List<SomeClass>)e.Result;

    // You're back in the UI thread, update your UI with the data
}

这一切都很笼统,我对您的环境做了一些假设。尝试一下并根据您的情况对其进行修改...如果您稍微尝试一下并遇到困难,那么 post 回到这里。