Параллельный.ForEach с ListView


У меня есть следующий код:

Parallel.ForEach(this.listView2.CheckedItems,
                    new ParallelOptions { MaxDegreeOfParallelism = 4 },
                    (CheckedItem) =>
                    {
                         //do something
                    });

И я получаю следующую компиляцию ошибку:

Аргументы типа для метода ' System.Нарезка резьбы.Задачи.Параллельный.(По Каждому Элементу Системы.Коллекции.Параллельный.Упорядочиваемый Участник, Система.Нарезка резьбы.Задачи.ParallelOptions, Системы.Действие) " не может быть выведено из употребления. Попробуйте указать аргументы типа явно.

Я искал, как использовать listview с задачами, но ничего не нашел.

Как это сделать могу ли я использовать параллель.ForEach с ListView?

2 2

2 ответа:

ListView.CheckedItems возвращаетCheckedItemsListViewCollection , который не реализует ни один из универсальных типов коллекций, так как он находится в .NET 1.X область, где дженерики еще не были доступны. Вы должны сказать PLinq, какие предметы находятся в коллекции. Если Вы читаете документацию, CheckedListViewCollection содержит ListViewItems. Linq можно использовать для явного указания типа с помощью метода расширения Cast.

Parallel.ForEach(this.listView2.CheckedItems.Cast<ListViewItem>(),
                    new ParallelOptions { MaxDegreeOfParallelism = 4 },
                    (CheckedItem) =>
                    {
                         //do something
                    });

Это все обсуждение, вероятно, станет устаревшим, так как ListViews (и, следовательно, большинство других элементов управления winform) могут быть доступны только из потока пользовательского интерфейса. Если вам нужно идти параллельно, вы можете создать копию данных в ListViewItem и работать над этим.

Измените код на следующий. Обратите внимание, что для этого вам нужно будет добавить оператор using для System.Linq из-за метода расширения Cast.

Parallel.ForEach<string>(this.listView2.CheckedItems.Cast<string>(), 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    (CheckedItem) => 
    { 
        //do something 
    });

Это должно компилироваться, потому что вы явно определяете тип, поскольку среда CLR не может выводить типы из неродовой коллекции.