Parallel.ForEach中的for循环未完成

时间:2017-09-30 15:36:57

标签: c# multithreading task parallel.foreach

我写了这段代码:

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成功完成了吗?

0 个答案:

没有答案