如何并行处理输入,直到C#中某些条件成立为止。
我正在使用位于(例如)StreamReader
或SqlDataReader
之上的接口。该界面公开了一种方法,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