与ListView的Parallel.ForEach

时间:2012-06-20 02:29:04

标签: c# task-parallel-library parallel.foreach

我有以下代码:

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一起使用?

2 个答案:

答案 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无法从非泛型集合中推断出类型。