C# 在线程内使用Parallel.Foreach

C# 在线程内使用Parallel.Foreach,c#,.net,linq,task-parallel-library,C#,.net,Linq,Task Parallel Library,我有一个线程,在服务启动时加载数据。我在这个线程中调用了一个方法,该方法使用Parallel.Foreach来迭代一组数据。但是我在并行forerach中使用的linq查询得到一个未设置为实例错误的objet引用 *如果我删除Parallel.Foreach或者删除线程,同样的逻辑也会起作用*即使锁定列表也无济于事** 我在linq查询内部得到一个异常-'e为null,因此对象引用错误' 非常感谢您的帮助。我猜加载的事件列表包含空元素。可能是由于竞争条件。您不应该锁定loadedEvents对象

我有一个线程,在服务启动时加载数据。我在这个线程中调用了一个方法,该方法使用Parallel.Foreach来迭代一组数据。但是我在并行forerach中使用的linq查询得到一个未设置为实例错误的objet引用

*如果我删除Parallel.Foreach或者删除线程,同样的逻辑也会起作用*即使锁定列表也无济于事**

我在linq查询内部得到一个异常-'e为null,因此对象引用错误'


非常感谢您的帮助。

我猜加载的事件列表包含空元素。可能是由于竞争条件。

您不应该锁定loadedEvents对象。根据:

最佳实践是定义要锁定的私有对象或私有对象 静态对象变量,用于保护所有实例共用的数据


您不需要锁定正在访问的对象,只需锁定一个对象即可。

代码中的loadedEvents设置在哪里?该变量为null,是罪魁祸首,需要更多信息。甚至在线程启动之前就已经预填充了该变量。我仔细检查了它,它是完全填充的,没有空值。事实上,如果我不从线程调用同一代码,那么它可以正常运行。当您在线程外启动它时,是否在代码中的同一位置调用它?loadedEvents的类型是什么?谢谢您的提示。但不幸的是,问题并非如此。当我在线程中调用parallel.foreach时,不知何故我得到了一个空引用错误。我接受这个答案,因为如果我以某种方式检查空条件,它就可以正常工作。但是,如果我只是在没有单独线程的情况下运行它,我仍然不知道为什么它在没有任何空检查的情况下工作。我也怀疑一些种族状况。
    loadingThread = new Thread(new ThreadStart(PreloadData));
                loadingThread.IsBackground = true;
                loadingThread.Start();
---------------------------------------

    public static void PreloadData()
    {
     Parallel.ForEach(loadedIDs.Keys, indexDefId =>
                    {
                        List<FixingEvent> lst = null;
                        lock (loadedEvents)
                        {
                            lst = (from e in loadedEvents where e.DIVACode.Equals(indexDefId) select e).ToList();
                        }

---------------------------
    }