1

オブジェクトでLinqを使用していますが、質問があります。

実際のワークロードはバックグラウンドジョブで処理されます。

実際のワークロードをそれ以上のタスクに費やすべきではありません。さらに重要なのは、実際の作業項目を処理するメソッドが非常に高速に処理して結果を出すため、完全なワークロードが作業項目のチャンクに配置されることです。

一度に処理するのはリストの最初のn個のオブジェクトのみであるため、n個のオブジェクトを取得して、作業項目の完全なリストから削除します。

Roughly:

int amount = 100;
List<WorkItem> actualWorkload = null;

lock(lockWorkload){ // complete Workload is filled in other thread
    if (actualWorkload.Count > amount)
    {
        actualWorkload.AddRange(completeWorkload.Take(amount));
    }
    else
    {
        actualWorkload.AddRange(completeWorkload);
    }
    completeWorkload.RemoveAll(x => actualWorkload.Contains(x));
}
//do something with workitems Process(actualWorkload);

私の質問は、「取得」と「削除」を何らかの方法で組み合わせて、アイテムを取得してリストからこのアイテムを直接削除する手順が1つだけになるようにすることはできますか?アイテムが返されるときにアイテムを削除するBlockingCollectionの「Take」に似たものを検索します。

4

2 に答える 2

0

それを可能にする操作があったとしても、バックグラウンドでそれらを削除して追加する必要があります。

しかし、多分あなたは2つのリストを必要としないのですか?たぶん、すべてのアイテムを含むリストを1つだけ持つことができ、各アイテムには、異なる値などに設定したステータスがあります。しかしもちろん、私はあなたの正確なケースを知らないので、これは実行可能ではないかもしれません。

于 2013-03-20T08:57:30.027 に答える
0

「取得して削除」は「デキュー」によく似ているので、おそらくQueueまたはConcurrentQueueを使用できますか?

ただし、列挙子はキューから項目を削除しないため、Dequeueを自分で繰り返し呼び出す必要があります。

于 2013-03-20T09:02:39.450 に答える