在线程内使用Parallel.Foreach

时间:2012-04-12 21:01:23

标签: c# .net linq task-parallel-library

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

* 如果删除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();
                        }

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

我在linq查询里面得到一个例外 - ' e为null,因此对象引用错误'

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您不应该锁定loadedEvents对象。根据{{​​3}}:

  

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

你不需要锁定你正在访问的对象 - 你只需要一个对象来锁定。

答案 1 :(得分:0)

我想listEvents列表包含null元素。可能是因为竞争条件。