我想添加一个项目到窗体上的列表框,向下滚动到最后一个条目,然后刷新它。我想在并行ForEach循环中完成此操作。
为此,我在网上找到了一个扩展方法,并将其改为我的需要。现在,我收到错误消息:“跨线程操作无效:从其创建的线程以外的线程访问控件'listBox1'”。我明白错误是工作线程试图访问列表框。事实上,我可以看到主线程可以在接收错误之前更新列表框。此外调试器告诉我,错误是在行“int visibleItems ...”
这怎么能做到?如何添加到列表框线程安全(通过扩展方法)
public static class MyClass
{
public static void AddItemThreadSafe(this System.Windows.Forms.ListBox lb, object item)
{
int visibleItems = lb.ClientSize.Height/lb.ItemHeight;
if (lb.InvokeRequired)
{
lb.Invoke(new MethodInvoker(delegate
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}));
}
else
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}
}
}
尝试声明变量“visibleItems”在代表块内部和其他时钟内。是的,代码重复,但应该工作 – Pyfhon
尝试[MethodImpl(MethodImplOptions.Synchronized)]上面的函数AddItemThreadSafe' –
我试过[MethodImpl(MethodImplOptions.Synchronized)]但它不能解决问题。我也在代理块中移动了“visibleItems”,但是这种改变导致程序冻结。 – Manngo