Windows 尝试使用多线程将大型数据集填充到组合框中时,表单冻结?
Windows form freezing when trying to use multithreading to populate large data set into a combox?
我正在尝试将大约 3000 个单词的列表填充到 windows 表单组合框下拉菜单中。在一个迭代循环中花费很长时间,所以我决定使用多线程让一个线程在列表的三分之一上做同样的工作。它运行得更快,但我注意到当线程为 运行 时它会冻结很多。我不确定这是锁定问题还是填充组合框项目列表需要很长时间。
我试过使用方法调用程序,但我觉得在这种情况下我使用它们是错误的。
我启动了这些线程:
Thread threadmid = new Thread(splitMidThird);
Thread threadtop = new Thread(splitTopThird);
threadmid.Start();
threadtop.Start();
private void splitMidThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds; index <= thirds * 2; index++)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
private void splitTopThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds * 2; index <= totalPartNumber.Count() - 1; index++I)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
当我尝试这个时,表格就死机了。
使用AddRange()方法:
When using this method to add items to the collection, you do not need
to call the BeginUpdate and EndUpdate methods to optimize performance.
类似于:
PartNumber_Text.Items.AddRange(totalPartNumber.ToArray());
我正在尝试将大约 3000 个单词的列表填充到 windows 表单组合框下拉菜单中。在一个迭代循环中花费很长时间,所以我决定使用多线程让一个线程在列表的三分之一上做同样的工作。它运行得更快,但我注意到当线程为 运行 时它会冻结很多。我不确定这是锁定问题还是填充组合框项目列表需要很长时间。
我试过使用方法调用程序,但我觉得在这种情况下我使用它们是错误的。
我启动了这些线程:
Thread threadmid = new Thread(splitMidThird);
Thread threadtop = new Thread(splitTopThird);
threadmid.Start();
threadtop.Start();
private void splitMidThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds; index <= thirds * 2; index++)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
private void splitTopThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds * 2; index <= totalPartNumber.Count() - 1; index++I)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
当我尝试这个时,表格就死机了。
使用AddRange()方法:
When using this method to add items to the collection, you do not need to call the BeginUpdate and EndUpdate methods to optimize performance.
类似于:
PartNumber_Text.Items.AddRange(totalPartNumber.ToArray());