如何在以下方法中创建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();
});
}
}
您可以通过在'prep'前添加一个null /默认值来强制执行一次:
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);
}
});
据我了解的问题,OP寻找的答案是您编写的第一个扩展方法。
@Jonathan Dickinson尝试了两个建议,并在两者上均收到“错误1扩展方法必须在非通用静态类中定义”。
@Canacourse-错误怎么说?提示:它告诉您如何定义扩展方法。
我错误地认为您的代码适用于UnorderedBuffer类。感谢您的回答(并提示)