在线程中使用 Parallel.Foreach

本文关键字:Parallel Foreach 线程 | 更新日期: 2023-09-27 18:30:50

我有一个线程,可以在服务启动时加载数据。我在此线程中调用一个方法,该方法使用 Parallel.Foreach 迭代一组数据。但是我在并行 forerach 中的 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 为空,因此对象引用错误'

任何帮助,不胜感激。

在线程中使用 Parallel.Foreach

不应锁定loadedEvents对象。根据 msdn:

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

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

我想列表加载的事件包含空元素。也许是由于比赛条件。