2015-11-03 115 views
0

我使用Parallel.ForEach作爲樣本時:凍結問題使用Parallel.ForEach

ParallelOptions parallelOpt = new ParallelOptions(); 
parallelOpt.MaxDegreeOfParallelism = 2; 
Parallel.ForEach(list, parallelOpt, info => 
    { 
     int threadID = Thread.CurrentThread.ManagedThreadId; 
     //use tmp var to avoid conflic with original var when using thread 
     ML_Scheduler tmp = new ML_Scheduler(); 
     tmp = ObjectCopier.Clone<ML_Scheduler>(info); 
     Stopwatch sw1 = Stopwatch.StartNew(); 
     logger.Info("\r\n\r\n"); 
     logger.Info(string.Format("[{0}]****** Begin to schedule work with ThreadID {0} for ScheduleID {1}.", threadID, tmp.SchedulerID)); 
     WorkWithEachSchedule(threadID, tmp, tmp.SchedulerID, dtNow, tmp.StartTime, false); 
     TimeSpan time1 = TimeSpan.FromSeconds(sw1.ElapsedMilliseconds/1000.0); 
     logger.Info(string.Format("[{0}]****** Finish to work with ThreadID {0} (during time : {1}).", threadID, time1.ToString(@"hh\:mm\:ss\:fff"))); 
    } 
); 

在功能WorkWithEachSchedule,我只是做:

  1. 創建數據表與各地10000記錄測試。

  2. 導出數據表到Excel 2007中

  3. 保存到本地文件夾。

在開始的時候,當我檢查細節中的任務管理器時,我看到CPU和內存正在工作。

但有些分鐘後,該程序將凍結(作爲樣本圖像) enter image description here

CPU和內存的兩個不工作,程序不工作什麼。

而且我也不能通過斷點來調試。

更新:

在我的代碼,我使用功能ExporttoExcel如下鏈接:http://mikesknowledgebase.azurewebsites.net/pages/CSharp/ExportToExcel.htm

當我刪除此功能,該程序可以工作正確。

我不知道爲什麼這個功能會導致問題。

有任何建議。謝謝。

+0

你怎麼導出到Excel? – Backs

+0

1 MaxDOP會發生什麼情況? – spender

+0

您可以隨時暫停程序,然後通過線程/任務,並在每個人檢查其堆棧。很可能你可以通過這種方式找到一些共享方法,它可以併發使用,但並不是設計爲併發安全的,或者你可以找到死鎖的原因。對於任何進一步的幫助,您將不得不提供對我們隱藏的代碼。可以用水做飯,但是,你也需要一些食材:)。 – ipavlu

回答

1

請注意,您使用的是注意到了這圖書館的作者:

寫大量的行(30,000),以Excel文件的時候也有一個問題。當有太多的數據要寫入時,OpenXML庫似乎只是掛起。我還沒有實現這個問題的解決方案。

筆者注意到,他解決了這個問題,但掛可能意味着,它仍然發出或許它並不意味着要同時使用...

+0

感謝ipavlu爲您提供有用的建議 –