Dav*_*vid 4 c# parallel-processing while-loop
我正在使用一个位于(例如)a StreamReader或者顶部的界面SqlDataReader.接口公开一个方法,GetNext()如果有任何对象,或者null如果没有剩下,则返回一个对象.
public interface ICollectionWidget<T>
{
T GetNext(); // Returns a T if there are any left, or null if there aren't
}
Run Code Online (Sandbox Code Playgroud)
我需要并行处理每个T返回的GetNext(),并在GetNext()返回时停止处理 null.我不太确定这是怎么做的(使用TPL或其他).我需要一种平行while!显然,我不希望任何线程仍然处理完成,当我得到一个null,我只是不想添加任何新的处理 - 然后当所有线程完成他们正在做的事情时退出'循环' .
有人可以帮忙吗?如果我的问题没有意义,请告诉我.
请注意,您正在展示的"集合"通常是通过透露IEnumerable<T>.如果您可以控制API本身,我会使用IEnumerable<T>而不是GetNext()基于迭代的方法.但是,如果不这样做,则执行转换很简单...
我会将此API包装为将其公开为IEnumerable<T>.然后你可以使用Parallel.ForEach:
private IEnumerable<T> EnumerateWidgets<T>(ICollectionWidget<T> widgets)
{
T element = widgets.GetNext();
while (element != null)
{
yield return element;
element = widgets.GetNext();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用:
Parallel.ForEach(EnumerateWidgets(widgetCollection), widget =>
{
// Process widget here
});
Run Code Online (Sandbox Code Playgroud)
这将在枚举小部件时防止线程问题(因为枚举器将是单线程的),但允许您并行处理集合.
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |