У меня есть три класса:TPL проблема управления потоком
BargeGrouper
класс, который реализует IBargeGrouper
и имеет Group(IEnumerable<Barge> ungrouped)
метод.
BargeGroupMap
класс, который реализует IBargeGroupShow
и имеет Show(IEnumerable<BargeGroup>
метод.
И класс, в котором я называю оба, если они: GroupingModule
и это Run()
.
Проблема заключается в том, что, когда я называю Group(ungrouped);
и затем хочу Show(bargeGroups);
я получил IndexOutOfRange
исключения в Show(bargeGroups);
потому что IEnumerable
я перехожу к нему в качестве параметра имеет свойство Count
гораздо больше, чем фактические элементы в нем. Я узнал, что сгруппированная коллекция возвращается как пусто от Group
большую часть времени, несмотря на то, что я использую ContinueWith
, чтобы заполнить эту коллекцию с помощью элементов BargeGroup
.
Group
метод BargeGrouper
public IEnumerable<BargeGroup> Group(IEnumerable<Barge> ungroupedBarges)
{
List<BargeGroup> bargeGroups = new List<BargeGroup>();
Int32 groupNumber = 0;
var riverBarges = from barge in ungroupedBarges
where barge != null && !String.IsNullOrEmpty(String.Intern(barge.River))
let river = String.Intern(barge.River)
orderby river, barge.MileMarker ascending
group barge by river into barges
select barges.AsEnumerable();
foreach (IEnumerable<Barge> barges in riverBarges)
{
Task.Run(() => ResolveRiver(barges, ref groupNumber)).ContinueWith(t=>
{
IEnumerable<BargeGroup> riverGroups = t.Result;
bargeGroups.AddRange(riverGroups);
});
}
return bargeGroups;
}
ShowBargeGroups
:
public void ShowBargeGroups(IEnumerable<BargeGroup> bargeGroups)
{
Console.WriteLine("Barge groups :");
if (bargeGroups != null)
{
foreach (var group in bargeGroups.Where(b => b != null))
{
var title = String.Format("{0}\n\t | {1} \t\t | {2} \t | {3} \t|", group.Id, "Id", "River", "MileMarker");
Console.WriteLine(title);
foreach (var barge in group.Barges)
{
var caption = String.Format("\t | {0}\t | {1} \t | {2} \t|", barge.Id, barge.River, barge.MileMarker);
Console.WriteLine(caption);
}
}
}
}
А использование в GroupingModule
:.
var groupBarges = bargeGrouper.Group(barges);
bargeGroupShow.ShowBargeGroups(groupBarges);
Что я могу сделать, чтобы исправить это?
Покажите нам 'ShowBargeGroups'. Какую версию .NET вы используете? –
@YuvalItzchakov, пожалуйста, см. Обновление. Я использую .net 4.5. Спасибо. – Sega