5

do以下の方法で-whileまたは同様の並列同等物を作成するにはどうすればよいUpdate()ですか?

アプリ内の別のスレッドがTestBufferランダムに書き込みます。が空TestBuffer.RemoveItemAndDoSomethingWithIt();になるまで実行する必要があります。TestBuffer現在Update()、コレクションが列挙されたときにコレクションに含まれていたアイテムでのみ実行されます。これは理にかなっています。

internal class UnOrderedBuffer<T> where T : class
{
    ConcurrentBag<T> GenericBag = new ConcurrentBag<T>();
}

internal class Tester
{
    private UnOrderedBuffer<Data> TestBuffer;

    public void Update()
    {
        Parallel.ForEach(TestBuffer, Item =>
        {
            TestBuffer.RemoveItemAndDoSomethingWithIt();
        });
    }
}
4

3 に答える 3

5

null /デフォルト値を「先頭に追加」することで、1回の実行を強制できます。

static IEnumerable<T> YieldOneDefault<T>(this IEnumerable<T> values)
{
    yield return default(T);
    foreach(var item in values)
        yield return item;
}

そして、それを次のように使用します。

Parallel.ForEach(TestBuffer.YieldOneDefault(), Item =>  
{  
    if(Item != null)
      TestBuffer.RemoveItemAndDoSomethingWithIt();
    else
      DoSomethingDuringTheFirstPass();
});  

次の拡張メソッドを探しているのではないかと思いますが、次のようになります。

public static IEnumerable<IEnumerable<T>> GetParrallelConsumingEnumerable<T>(this IProducerConsumerCollection<T> collection)
{
    T item;
    while (collection.TryTake(out item))
    {
        yield return GetParrallelConsumingEnumerableInner(collection, item);
    }
}

private static IEnumerable<T> GetParrallelConsumingEnumerableInner<T>(IProducerConsumerCollection<T> collection, T item)
{
    yield return item;
    while (collection.TryTake(out item))
    {
        yield return item;
    }
}

これはあなたにこの結果をもたらすでしょう(私はあなたが求めているものだと思います):

Parallel.ForEach(TestBuffer.GetParrallelConsumingEnumerable(), Items =>       
{
    foreach(var item in Items)
    {
       DoSomethingWithItem(item);
    }
});
于 2011-09-13T10:29:53.897 に答える
4

for/foreach通常、複数のアイテムに対してタスクを実行するために使用されます。

while-do/ do-whileは:

a. まだ列挙されていない複数のアイテム (ツリーなど) に対してタスクを実行する。
- この場合、BFS または DFS 列挙子を定義して foreach で使用できます。

b. 単一のアイテムに対して反復作業を実行する
- 反復作業は並列処理には適していません

コードをシリアルからパラレルにリファクタリングしようとしないでください。代わりに、割り当てが何であるか、およびそれを並行して行うのに最適な方法を検討してください。(コードではなく、アルゴリズムをリファクタリングします。)

于 2011-09-13T10:35:59.960 に答える