与ListView的Parallel.ForEach

Ken*_*ndt 2 c# task-parallel-library parallel.foreach

我有以下代码:

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

我得到以下编译错误:

无法从用法中推断出方法'System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner,System.Threading.Tasks.ParallelOptions,System.Action)'的类型参数.尝试显式指定类型参数.

我搜索了如何使用listview与任务,但找不到任何东西.

如何在ListView中使用Parallel.ForEach?

Pol*_*ity 8

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
                    });
Run Code Online (Sandbox Code Playgroud)

整个讨论可能会过时,因为ListViews(以及大多数其他winform控件)只能从UI线程访问.如果必须并行,则可以在ListViewItem中创建数据的副本并对其进行处理.