В моей программе продукт (или ингредиент) должен обновить свои собственные цены родителей, и эти родители должны сделать то же самое для своих родителей и так далее.Queuing Nested Threads
Я написал метод, как это:
public static Price CalculatePrice(this IProduct pro)
{
/// calculation stuff
}
private static SystemContext innerContext;
/// <summary>
/// In the main controller this method called for updates
/// </summary>
/// <param name="pro"></param>
/// <param name="sc"></param>
public static void UpdatePrice(this IProduct pro, ref SystemContext sc)
{
if (sc.Relations.Where(t => t.SubProduct.ID == pro.ID).Any())
{
// If this returns any, this means there are some products using this product as their sub-product.
var list = sc.Relations.Where(t => t.SubProduct.ID == pro.ID).ToList();
ConcurrentQueue<Relation> quee = new ConcurrentQueue<Relation>(list);
innerContext = new SystemContext();
Task task = new Task(() => UpdatePrice(ref quee));
task.Start();
}
}
private static void UpdatePrice(ref ConcurrentQueue<Relation> queue)
{
Relation val;
while (queue.TryDequeue(out val))
{
val.Product.Price = val.Product.CalculatePrice();
var list = innerContext.Relations.Where(t => t.SubProduct.ID == val.Product.ID);
if (list.Any())
{
ConcurrentQueue<Relation> quee = new ConcurrentQueue<Relation>(list);
Task task = new Task(() => UpdatePrice(ref quee));
task.Start();
}
}
}
Хотя, первый уровень родительских продуктов обновляются, второй уровень не является.
Есть ли лучшая логика для этого?
И, кстати, любой из продуктов самого низкого уровня имеет приблизительно 1000 родителей (рекурсивно). Это означает, что требуется много времени (из-за расчета цены). Так что было бы идеально, если вы обратите внимание на время и когда вы даете совет ...
Редактировать
В то время как я делал некоторые испытания. Я полагал, что некоторые продукты с низким уровнем дохода имеют 4000 родителей.
Рассматривали ли вы с помощью рекурсии? Кроме того, зачем вам нужен поток для каждого родителя? –
Да. Я получил исключение StackOverflow без многопоточности. – paroxit
О, теперь я вижу, что у вас 1000 родителей. Доступны ли эти родители только для рекурсивного прохождения каждого объекта? См. [This] (http://stackoverflow.com/questions/141467/recursive-list-flattening) для примера. –