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

VB.NET How to get a control collection to cast to the enumerable in Parallel.ForEach

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

我正在尝试为每个循环打开它

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

进入Parallel.ForEach循环。我在语法上苦苦挣扎,这次在线文档特别含糊。我已经走到这一步了:

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

这会在编译时出错 "System.InvalidCastException: 'Unable to cast object of type 'ControlCollection' to type 'System.Collections.Generic.IEnumerable`1[System.Windows.Forms.Control]'.'" 而且我真的不知道从这里去哪里。

ControlCollection 实现了 IEnumerable,但没有实现 IEnumerable<T>IEnumerable<T>Parallel.ForEach 期望的类型。

要将控件集合转换为 IEnumerable(Of Control),您可以使用

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();