VB.NET如何将控件集合强制转换为Parallel.ForEach中的可枚举项

VB.NET如何将控件集合强制转换为Parallel.ForEach中的可枚举项,vb.net,parallel.foreach,Vb.net,Parallel.foreach,非常简单,我需要在FlowLayoutPanel中调整几百个PictureBox的大小。为了加快速度,我正在试验Parallel.ForEach 我试着在每个循环中改变这个 For Each p As Control In Me.PanelMain.Controls p.Size = New Size(GWidth, GHeight) Next 进入并行的ForEach循环。我正在努力解决语法问题,而这次在线文档尤其晦涩难懂。我已经走了这么远: Parallel.For

非常简单,我需要在FlowLayoutPanel中调整几百个PictureBox的大小。为了加快速度,我正在试验Parallel.ForEach

我试着在每个循环中改变这个

For Each p As Control In Me.PanelMain.Controls
            p.Size = New Size(GWidth, GHeight)
Next
进入并行的ForEach循环。我正在努力解决语法问题,而这次在线文档尤其晦涩难懂。我已经走了这么远:

Parallel.ForEach(Of Control)(Me.PanelMain.Controls, Sub(resize)
                                                    resize.Size = New Size(GWidth, GHeight)
                                                End Sub
                                    )

这在编译“System.InvalidCastException:'无法将类型为'ControlCollection'的对象强制转换为类型为'System.Collections.Generic.IEnumerable'1[System.Windows.Forms.Control]”时出现错误,我真的不知道从这里开始该怎么办。

ControlCollection
实现了
IEnumerable
,但不是
IEnumerable
IEnumerable
是一种
并行的类型。ForEach
应为

要将控件集合强制转换为IEnumerable(控件的),可以使用

Dim controls = Me.PanelMain.Controls.Cast(Of Control)()

Parallel.ForEach(controls, Sub(control) control.Size = New Size(GWidth, GHeight))
请注意,UI控件只能在创建它们的线程上更新。因此,在多个线程之间拆分大小调整将不会像您预期的那样工作

我会重新考虑在表单上有数百个图片库,用户能一次看到所有图片库吗

也就是说,您可以尝试通过在每次调整控件大小后暂停表单重画来加快更新控件的速度

Me.PanelMain.SuspendLayout();

Dim newSize As New Size(GWidth, GHeight)
For Each p As Control In Me.PanelMain.Controls
    p.Size = newSize
Next

Me.PanelMain.ResumeLayout();

ControlCollection
实现
IEnumerable
,但不实现
IEnumerable
IEnumerable
是一种
并行的类型。ForEach
应为

要将控件集合强制转换为IEnumerable(控件的),可以使用

Dim controls = Me.PanelMain.Controls.Cast(Of Control)()

Parallel.ForEach(controls, Sub(control) control.Size = New Size(GWidth, GHeight))
请注意,UI控件只能在创建它们的线程上更新。因此,在多个线程之间拆分大小调整将不会像您预期的那样工作

我会重新考虑在表单上有数百个图片库,用户能一次看到所有图片库吗

也就是说,您可以尝试通过在每次调整控件大小后暂停表单重画来加快更新控件的速度

Me.PanelMain.SuspendLayout();

Dim newSize As New Size(GWidth, GHeight)
For Each p As Control In Me.PanelMain.Controls
    p.Size = newSize
Next

Me.PanelMain.ResumeLayout();

用户一次只能看到一组图片,但用户希望滚动浏览这些图片,因此,如果它们不是全部可见,则必须从视图中的部分快速加载和卸载。是否有一种更有效的方法来绘制图像并使用一组我应该探索的图片框?编辑:将Me.SuspendLayout更改为PanelMain.SuspendLayout,这使我获得了所需的加速。非常感谢!给我增加了100倍的速度。也要像你建议的那样,在循环之外设置新闻大小。用户一次只能看到一组图片,但用户希望滚动浏览它们,因此如果它们不是全部可见,则必须从视图中的部分快速加载和卸载。是否有一种更有效的方法来绘制图像并使用一组我应该探索的图片框?编辑:将Me.SuspendLayout更改为PanelMain.SuspendLayout,这使我获得了所需的加速。非常感谢!给我增加了100倍的速度。也会像你建议的那样,在圈外发布新闻。