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 を使用するにはどうすればよいですか?

4

2 に答える 2

8

ListView.CheckedItems は、ジェネリックがまだ利用できなかった .NET 1.x 領域にあるため、ジェネリック コレクション型を実装しないCheckedItemsListViewCollectionを返します。コレクションに存在するアイテムの種類を PLinq に伝える必要があります。ドキュメントを読むと、 CheckedListViewCollection にはListViewItemsが含まれています。Cast 拡張メソッドを使用して、Linq を使用して型を明示的に指定できます。

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これを機能させるには、Cast 拡張メソッドのため、System.Linq のステートメントを追加する必要があることに注意してください。

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

CLRは非ジェネリックコレクションから型を推測できないため、型を明示的に定義しているため、コンパイルする必要があります。

于 2012-06-20T02:53:21.280 に答える