我正在编写一个简单的应用程序(用于测试目的),将10M个元素添加到ListBox中。我使用一个BackgroundWorker来执行工作,使用ProgressBar控件显示进度。
每个元素只是一个带有索引的"Hello World!"字符串,我在过程中添加。我的程序需要7-8秒才能填满ListBox,我想知道是否可以通过使用计算机上所有可用的核心(8个)来加快速度。
为了达到这个目的,我尝试使用TPL库,更精确地说是使用Parallel.For循环,但结果是不可预测的,或者它不能按照我希望的方式工作。
以下是我的应用程序代码:
我尝试编写的并行实现(应放在DoWork中)如下:
结果是应用程序会冻结,并需要15秒左右的时间才能填充ListBox。(元素也是无序的)
在这种情况下可以采取什么措施,使用并行处理能加速“填充”过程吗?
每个元素只是一个带有索引的"Hello World!"字符串,我在过程中添加。我的程序需要7-8秒才能填满ListBox,我想知道是否可以通过使用计算机上所有可用的核心(8个)来加快速度。
为了达到这个目的,我尝试使用TPL库,更精确地说是使用Parallel.For循环,但结果是不可预测的,或者它不能按照我希望的方式工作。
以下是我的应用程序代码:
private BackgroundWorker worker = new BackgroundWorker();
private Stopwatch sw = new Stopwatch();
private List<String> numbersList = new List<String>();
public MainWindow()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
sw.Start();
int max = 10000000;
int oldProgress = 0;
for (int i = 1; i <= max; i++)
{
numbersList.Add("Hello World! [" + i + "]");
int progressPercentage = Convert.ToInt32((double)i / max * 100);
// Only report progress when it changes
if (progressPercentage != oldProgress)
{
worker.ReportProgress(progressPercentage);
oldProgress = progressPercentage;
}
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pb.Value = e.ProgressPercentage;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lstLoremIpsum.ItemsSource = numbersList;
lblCompleted.Content = "OK";
lblCompleted.Content += " (" + numbersList.Count + " elements added" + ")";
lblElementiLista.Content += " (" +sw.Elapsed.TotalSeconds + ")";
worker.Dispose();
}
}
我尝试编写的并行实现(应放在DoWork中)如下:
Parallel.For(1, max, i =>
{
lock (lockObject)
{
numbersList.Add("Hello World! [" + i + "]");
}
int progressPercentage = Convert.ToInt32((double)i / max * 100);
// Only report progress when it changes
if (progressPercentage != oldProgress)
{
worker.ReportProgress(progressPercentage);
oldProgress = progressPercentage;
}
});
结果是应用程序会冻结,并需要15秒左右的时间才能填充ListBox。(元素也是无序的)
在这种情况下可以采取什么措施,使用并行处理能加速“填充”过程吗?