VB. NET Как получить коллекцию элементов управления для приведения к перечисляемому в Parallel.ForEach - PullRequest
0 голосов
/ 28 марта 2020

Довольно просто, мне нужно изменить размеры нескольких сотен коробок внутри FlowLayoutPanel. В попытке ускорить его, я экспериментирую с Parallel.ForEach

Я пытаюсь включить это для каждого l oop

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

В Parallel.ForEach l oop. Я борюсь с синтаксисом, и онлайн документация особенно крипта c на этот раз. Я получил это далеко:

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

Это дает ошибку при компиляции "System.InvalidCastException:" Невозможно привести объект типа 'ControlCollection' к типу 'System.Collections.Generi c .IEnumerable `1 [System. Windows .Forms.Control] '.'" И я действительно просто не знаю, где отсюда go.

1 Ответ

2 голосов
/ 28 марта 2020

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

Обратите внимание, что элементы управления пользовательского интерфейса могут обновляться только на нить они были созданы на. Таким образом, разделение изменения размера между несколькими потоками не будет работать так, как вы ожидаете.

Я бы пересмотрел наличие сотен ящиков для фотографий в форме, может ли пользователь видеть все ящики для фотографий одновременно?

Тем не менее, вы можете попытаться ускорить обновление элементов управления, приостановив перерисовку формы после каждого изменения размера элемента.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...