如何在从 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 回到这里。
我有检索数据的方法。我在后台工作人员 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 回到这里。