【发布时间】:2011-03-31 07:49:31
【问题描述】:
我有一个无法调试的奇怪问题。这是一个解析信息的委托:
Action<XElement, String> ParseXMLInfo = (s, t) =>
{
using (var Ctx = new Entities())
{
var Records = s.Elements("record");
Parallel.ForEach(
ParallelEnumerable.Range(0, Records.Count()),
u =>
{
var el = Records.ElementAt(u);
try
{
var NTR = new tbl_UserInfo();
NTR.first_name = el.Element("first_name").Value;
NTR.last_name = el.Element("last_name").Value;
Ctx.AddTotbl_UserInfo(NTR);
}
catch (Exception excp)
{
Console.WriteLine(System.DateTime.Now + " " + excp.Message);
}
}
);
Ctx.SaveChanges();
}
};
委托本身被调用两次,如下:
Parallel.Invoke(
() =>
{
var XMLDoc_MaleInfo = XElement.Load("MaleNames.xml");
Console.WriteLine("Fetching records from MaleNames.xml; starting at " + System.DateTime.Now);
ParseXMLInfo(XMLDoc_MaleInfo, "male");
},
() =>
{
var XMLDoc_FemaleInfo = XElement.Load("FemaleNames.xml");
Console.WriteLine("Fetching records from FemaleNames.xml; starting at " + System.DateTime.Now);
ParseXMLInfo(XMLDoc_MaleInfo, "female");
}
);
一切似乎都运行正常。特别是,委托的 Parallel.ForEach 部分运行时没有任何错误。但随后,代码在Ctx.SaveChanges () 行中断,并显示消息
对象引用未设置为对象的实例。
但是当我将鼠标悬停在Ctx(处于这种损坏状态)上时,Ctx 不会显示为null。
谁能告诉我这是怎么回事?
【问题讨论】:
-
您可以发布您的
Entities课程吗?我怀疑它不是线程安全的。而且您正在从多个线程对其进行写入。 -
@CodeInChaos Entities 类是在我添加 ADO.NET 实体数据模型时由 .NET 生成的。我没有修改系统本身为它生成的代码。如果你真的想要,我可以把整个文件贴出来,但是太长了。
-
@CodeInChaos 您可能正在做某事。当我注释掉“try”和“catch”行时,AttTotbl_UserInfo 出现以下错误:“Test.tbl_UserInfo 类型已被多次映射。”
标签: c# multithreading parallel.foreach