2011-05-19 67 views
2

當該代碼奔跑告訴我此錯誤: 錯誤「不設置到對象的實例對象引用」發生在第一行=>MinorDBDataContext mdc = new ...C#並行循環問題

而且還與串行爲「 for(int i; i < 1005; i ++){}「正常工作。

有什麼問題?

Thread.CurrentThread.Priority = ThreadPriority.Highest; 
     var query = from M in new MajorDBDataContext().User_Accounts select M; 
     List<User_Account> Ulist = query.ToList(); 
     string d = DateTime.Now.ToString(); 
     int c = 0; 
     string temp =""; 
     Parallel.For(0, 1005, (i,loop) => 
     { 
       try 
       { 
        MinorDBDataContext mdc = new MinorDBDataContext(_Filings.OnServerRepository(Ulist[i].user_Sys_DBPath)); 
        GoodJob(mdc, temp, i); 
        DA.Page page = mdc.Pages.Single(); 
        temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Email; 
        temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Name; 
        temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Family + i.ToString(); 
       } 
       catch { } 
     }); 
     append(temp); 
+0

考慮使用StringBuilder而不是String來實現。 – 2011-05-19 12:03:31

+1

使用StringBuilder可能無法解決多個線程同時向StringBuilder添加的問題,從而在StringBuilder或損壞的字符串中產生不一致的狀態。 StringBuilder中的各個Append語句可能會在最好的情況下被無序地應用。 – 2011-05-19 12:05:23

+0

@Colin:對不起,我並沒有試圖回答這個問題。我只是指出字符串concat不會爲這裏的表現創造奇蹟。我應該說清楚。謝謝。 – 2011-05-19 12:09:02

回答

5

您的異常可能指示其他事情。哪個值實際上是null?你不說。

我可以看到這段代碼的一些問題。

不能依賴於循環的順序,但是在整個並行代碼中有temp +=(向現有字符串順序添加字符串,然後將字符串分配回原始變量)。臨時設置在並行循環之外。這非常危險。濫用共享狀態/數據/資源是多線程代碼中最常見的錯誤之一。

溫度可能會超出順序添加的值。同時將多個東西添加到臨時文件中,因此,臨時文件將被多個線程覆蓋,因此臨時文件可能會丟失信息。

_Filings從哪裏來?它是什麼?

您可能希望創建一個新的tempstring內環路,並添加那裏的一切,加入最終tempConcurrentBag在每次迭代中(其中創建循環外)。之後,在並行循環之外,您可以遍歷ConcurrentBag,並在安全的環境中構建您的最終字符串。基於評論

更新 評論:

System.Web.HttpContext.Current.Server.MapPath used and HttpContext.Current is null in Multi Thread loop.

這樣做的原因是,你現在是在不同的線程到當前HttpContext,因此不能回答你的任何問題。您必須將上下文傳遞給並行任務或從其中取得單個值。我不知道在並行環境中有多危險。

HttpContext myContext = HttpContext.Current; 

在你的並行循環中使用myContext而不是HttpContext.Current

我不建議這樣做,因爲HttpContext在某些領域(如數據層)的知識會造成不必要的耦合,並且使應用程序很難維護。爲了推薦更好的解決方案,需要將應用程序分開更多,這在論壇發佈中可行。但是,目前它應該讓你再次移動。

+0

_Filings.OnServerRepository返回DataContext連接字符串的.mdf文件。該項目由每個用戶[數據庫設計]的1個數據庫計劃。在此函數中使用了System.Web.HttpContext.Current.Server.MapPath,並且在多線程循環中HttpContext.Current爲null。感謝您的幫助 – 2011-05-19 12:07:27