我有以下代码:
Parallel.ForEach(this.listView2.CheckedItems,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
(CheckedItem) =>
{
//do something
});
我收到以下编译错误:
无法从用法中推断出方法'System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner,System.Threading.Tasks.ParallelOptions,System.Action)'的类型参数。尝试明确指定类型参数。
我搜索了如何将listview用于任务但却找不到任何内容。
如何将Parallel.ForEach与ListView一起使用?
答案 0 :(得分: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
});
由于ListViews(以及大多数其他winform控件)只能从UI线程访问,因此整个讨论可能会过时。如果必须并行,可以在ListViewItem中创建数据的副本并对其进行处理。
答案 1 :(得分:1)
将代码更改为以下内容。请注意,为了实现此目的,您需要为System.Linq添加using
语句,因为Cast扩展方法。
Parallel.ForEach<string>(this.listView2.CheckedItems.Cast<string>(),
new ParallelOptions { MaxDegreeOfParallelism = 4 },
(CheckedItem) =>
{
//do something
});
这应该编译,因为您明确定义了类型,因为CLR无法从非泛型集合中推断出类型。