这对我来说听起来非常像TPL的问题。你有一组已知的数据。您想分割一些繁重的处理并行运行,并且希望能够批处理负载。
我没有看到问题的任何地方是异步的源代码,是运动数据的源代码或需要被动的消费者。这是我建议您使用TPL的理由。
在另一个注释中,为什么要并行处理10个幻数?这是业务需求,还是潜在的优化性能的尝试?通常最好的做法是让TaskPool根据核心数量和当前负载计算出最适合客户端CPU的最佳实践。我想,随着设备及其CPU结构(单核,多核,多核,低功耗/禁用内核等)的巨大变化,这变得越来越重要。
这里有一种方法可以做到这在LinqPad(但要注意缺乏Rx的)
void Main()
{
var source = new List<Item>();
for (int i = 0; i < 100; i++){source.Add(new Item(i));}
//Put into batches of ten, but only then pass on the item, not the temporary tuple construct.
var batches = source.Select((item, idx) =>new {item, idx})
.GroupBy(tuple=>tuple.idx/10, tuple=>tuple.item);
//Process one batch at a time (serially), but process the items of the batch in parallel (concurrently).
foreach (var batch in batches)
{
"Processing batch...".Dump();
var results = batch.AsParallel().Select (item => item.Process());
foreach (var result in results)
{
result.Dump();
}
"Processed batch.".Dump();
}
}
public class Item
{
private static readonly Random _rnd = new Random();
private readonly int _id;
public Item(int id)
{
_id = id;
}
public int Id { get {return _id;} }
public double Process()
{
var threadId = Thread.CurrentThread.ManagedThreadId;
string.Format("Processing on thread:{0}", threadId).Dump(Id);
var loopCount = _rnd.Next(10000,1000000);
Thread.SpinWait(loopCount);
return _rnd.NextDouble();
}
public override string ToString()
{
return string.Format("Item:{0}", _id);
}
}
如果你有一个数据在运动问题或反应我很想找出消费者问题,但只是“淡化”了问题,以便于解释。
谢谢阿隆。你能解释一下你的代码吗?非常感谢 – user2017793 2013-02-26 14:12:07
真的很简单。窗口(10)将工作转换为块10.合并(1)在单个线程上工作。将这10名学生转换成一个内部可观察的。呃,做一些工作吧。 ObserveOnDispatcher()返回到下一位的UI线程。 Do ...嗯...在UpdatingUI上工作。最后订阅内部可观察。冲洗并重复。 – Aron 2013-02-26 14:55:38
再次感谢阿隆。我的疑问是如何释放每个10个学生对象资源。你的解释非常有帮助,非常感谢。我担心内存不足问题。请帮助我。 – user2017793 2013-02-26 15:08:15