如何并行处理输入,直到C#中某些条件成立为止。

我正在使用位于(例如)StreamReaderSqlDataReader之上的接口。该界面公开了一种方法,GetNext(),如果有任何遗漏,它将返回一个对象,或者如果没有遗漏,则返回null。如何并行处理输入,直到C#中某些条件成立为止。

public interface ICollectionWidget<T> 

{

T GetNext(); // Returns a T if there are any left, or null if there aren't

}

我需要并行处理返回由每个GetNext()T,并停止处理时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();

}

}

然后,您可以使用:

Parallel.ForEach(EnumerateWidgets(widgetCollection), widget => 

{

// Process widget here

});

这将避免线程问题,同时列举你的部件(如枚举将是单线程的),但允许你处理你并行采集。

回答:

您还可以使用

Task.Factory.StartNew() 

回答:

只是要一个iterator:

public interface ICollectionWidget<T> 

{

IEnumerable<T> GetItems();

}

public class CollectionWidget : ICollectionWidget<int>

{

public IEnumerable<int> GetItems()

{

var i = 0;

while (i++ < 10)

{

yield return i;

}

yield break;

}

}

Parallel使用它:

 var widget = new CollectionWidget(); 

Parallel.ForEach(widget.GetItems(), i => Console.WriteLine(i));

以上是 如何并行处理输入,直到C#中某些条件成立为止。 的全部内容, 来源链接: utcz.com/qa/263543.html

回到顶部