簡體   English   中英

Parallel.ForEach中的C#錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM