我写了这段代码:
private async Task<ConcurrentBag<IrfRecord>> ProcessData(string sourceFileContent)
{
var irfs = new ConcurrentBag<IrfRecord>();
var indexArr = new[]
{
3, 13, 23, 25, 35, 45, 55, 56, 59,
69, 74, 94, 96, 97, 122, 137, 152, 162, 172, 182, 192, 202, 212, 213, 215, 217
};
var splittedContent = sourceFileContent.Split(new []{ Environment.NewLine }, StringSplitOptions.None);
await Task.Run(() =>
{
IrfRecord irf;
Parallel.ForEach(splittedContent, (lne,loopState) =>
{
if (lne.Length == 0)
{
return;
}
try
{
irf = new IrfRecord()
{
Key = lne.Substring(3, 10) + "-" + lne.Substring(45, 10),
Body = SplitAt(lne, indexArr).Select((item, idx) => new IrfRecordProperty
{
Value = item
}).ToList()
};
for (var i = 0; i < irf.Body.Count -1; i++)
{
irf.Body[i].Settings = irf.Body[i].GetValue(i);
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
irfs.Add(irf);
});
});
return irfs;
}
我使用不同的方法,例如:
var sourceObjects = ProcessData(await sourceFileRead);
var outboundObjects = ProcessData(await outboundFileRead);
await Task.WhenAll(sourceObjects, outboundObjects);
但是,我在代码中继续在irf.Body[i].Settings
上获得NullPointerExceptions,因为内部循环意味着由于某种原因没有完成它的工作。内部循环使用GetValue
方法,永远不会返回null。
我想也许我在任务没有完成时继续,但我在第二个代码块上看到Task.WhenAll
。请注意,在我进行调试时,99%的Body[i].Settings
按预期填充。
我真的没有得到它,我的内部循环应该只是正常完成如果外部并行foreach成功完成了吗?