2015-11-03 86 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为您提供有用的建议 –