2012-08-23 125 views
4

一直在爲我的應用程序尋找多線程解決方案,但在嘗試時會隨機出現NullReferenceException錯誤,而不是當我連續運行每一個時發生的一切,順利。使用Code-First EF的多線程ASP.net MVC3 EF

我正在做的是計算從一個地方到另一個地方的旅程,然後計算回程。返程旅程計算只是使用相同的過程,僅在出發地和目的地切換時進行。

這聽起來是可行的與多線程在一個實體框架的ASP.net MVC3應用程序?我看過一些文章,看起來EF似乎有問題,但這些聽起來像是在頁面上共享DBContexts時的問題,而我在所有需要訪問數據庫的地方使用Using語句。任何人有任何經驗嗎?

基本相關的代碼我到目前爲止是這樣的:

var outboundJourneyTask = Task.Factory.StartNew(() => BuildJourney(true)); 
var returnJourneyTask = Task.Factory.StartNew(() => BuildJourney(false)); 
Task.WaitAll(outboundJourneyTask, returnJourneyTask); 

什麼我所希望的是,每個任務會重新開始,但由於空引用例外,我認爲在第二個線程,它試圖使用第一個構建的數組,當它找不到某些元素時,會拋出錯誤。

聽起來可能?任何人都知道這樣做的更好方法?

編輯:我想穿不同的方法(見下文),但也有很奇怪的事情與我的陣列發生 - 通過他們不同的循環,並引發錯誤

Thread t1 = new Thread(ThreadMethod1); 
t1.Start(); 

Thread t2 = new Thread(ThreadMethod2); 
t2.Start(); 

void ThreadMethod1(object state) 
{ 
    BuildJourney(false); 
    ManualResetEvent mre = (ManualResetEvent)state; 
    mre.Set(); 
} 
void ThreadMethod2(object state) 
{ 
    BuildJourney(true); 
    ManualResetEvent mre = (ManualResetEvent)state; 
    mre.Set(); 
} 

感謝

+1

你的'BuildJourney'方法是怎樣的? –

+1

它太大了,因爲它包含很多其他功能和計算,所以在這裏發佈太大了!處理需要大約7-10秒,這就是爲什麼我希望它們同時運行的原因。它包含幾個數據庫調用,幾個計算並返回視圖模型的通用列表。 –

+1

但在這種情況下,如果我們不知道您的電話可以共享哪些資源,我們幾乎無法幫助您。 –

回答

4

「這聽起來可行嗎??「 是的,當然。

易於實施.....也許不是。

Thread t1 = new Thread(ThreadMethod1)

是過時的,但不一定是過時的方式做在.NET框架4+多線程。從你發佈的信息來看,沒有任何信息表明你不能使用任務。任務工廠是更現代的管理TPL任務的方式,但我個人發現它有一些怪癖。如果我是你,我會嘗試這樣做:

Task T = new Task(() => 
       { 
        BuildJourney(true); 
       }); 
       Task T2 = T.ContinueWith((antecedent) => 
       { 
        BuildJourney(false); 
       }); 

這將確保T2僅在T1返回時運行。儘管如Ladislav所說的BuildJourney方法可能不是線程安全的。這至少會讓你更進一步確定線程故障的位置。您可能想要調查適當的異步和多線程調試。它比簡單的F5更復雜一點。諸如pluralsight和代碼項目之類的網站在調試和編寫.net線程編程方面都有很好的教程。

你在這裏有一個非常好的開始。祝你好運!

+0

Igor關於線程安全資源的評論是絕對正確的。我會在這裏做一些研究http://msdn.microsoft.com/en-us/library/dd460717.aspx爲了確定你可以使用,以便這些任務可以同時運行。 –

+2

我的麪條越多發生的越多,我認爲你的BuildJourney類不能運行多線程。至少不是沒有改變。如果您只想讓Buildjourney的一個實例一次在主線程之外運行,上面的代碼將起作用。您可能不得不重構BuildJourney。另外,一種方法越複雜,線程安全的可能性就越小。 –

+1

的確 - 我認爲你絕對正確。根據你發佈的MSDN庫鏈接判斷,在我的所有進程中有很多不是線程安全的東西,這會導致我在線程中運行時遇到的奇怪錯誤。我想我需要重構,但是我幾乎要在這個項目中投入使用 - 我只是想讓它變得更快,所以無論是現在還是在我們上線後重構都是我可以選擇的一種啤酒今晚!謝謝你的回答肖恩,非常有幫助。 –