2

我有以下代码:

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

4

2 回答 2

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 中创建数据的副本并对其进行处理。

于 2012-06-20T02:57:55.300 回答
1

将代码更改为以下内容。请注意,要使其正常工作,您需要using为 System.Linq 添加一条语句,因为使用 Cast 扩展方法。

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

这应该可以编译,因为您明确定义了类型,因为 CLR 无法从非泛型集合中推断类型。

于 2012-06-20T02:53:21.280 回答