如何在C#中将某些条件设置为真并行处理输入

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,我只是不想添加任何新的处理 - 然后当所有线程完成他们正在做的事情时退出'循环' .

有人可以帮忙吗?如果我的问题没有意义,请告诉我.

Ree*_*sey 5

请注意,您正在展示的"集合"通常是通过透露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)

这将在枚举小部件时防止线程问题(因为枚举器将是单线程的),但允许您并行处理集合.