我有一个线程在服务启动时加载数据。我在这个线程中调用一个方法,该方法使用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,因此对象引用错误'。
感谢任何帮助。
答案 0 :(得分:1)
您不应该锁定loadedEvents
对象。根据{{3}}:
最佳做法是定义要锁定的私有对象或私有对象 静态对象变量,用于保护所有实例共有的数据。
你不需要锁定你正在访问的对象 - 你只需要一个对象来锁定。
答案 1 :(得分:0)
我想listEvents列表包含null元素。可能是因为竞争条件。