[英]C# error in Parallel.ForEach
我有一個奇怪的問題,我無法調試。 這是解析信息的委托:
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不會顯示為空。
有人可以告訴我發生了什么嗎? 提前致謝。
認為應該是:
ParallelEnumerable.Range (0, Records.Count()-1)
好的,在仔細閱讀了MSDN文檔之后,我看來目前至少已經提出了一種解決方案。 這是重構后的代碼。
Action<XElement, String> ParseXMLInfo = (s, t) => {
var Records = s.Elements ("record");
Parallel.ForEach (
ParallelEnumerable.Range (0, Records.Count ()),
() => new Testing_And_Benchmarking_Entities (),
(u, L, v) => {
var el = Records.ElementAt (u);
var NTR = new tbl_UserInfo ();
NTR.first_name = el.Element ("first_name").Value;
NTR.last_name = el.Element ("last_name").Value;
v.AddTotbl_UserInfo (NTR);
return v;
},
(v) => v.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 MaleNames.xml; starting at " + System.DateTime.Now);
ParseXMLInfo (XMLDoc_FemaleInfo, "female");
}
);
我必須使用Parallel.ForEach的其他重載簽名。 在此重載中,不共享與上一個示例中的Ctx變量等效的示例(在此示例中為“ v”,請原諒隱式變量名稱)。 因此避免了錯誤。
我仍然希望有一位博學的人對我的解決方案是否是唯一的解決方案,或者是否有更好,更慣用的C#解決方案發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.