我使用Linq2Sql检索用于启动SSRS报告导出的SSRS Web服务的ID列表。 该查询检索大约200个项目,并使用foreach循环来遍历它们。
我将包含ID的List对象传递给在新线程中执行的方法。
SSRS报告生成时间很长,因此有时当服务器由于工作负载而变慢时,整体执行会超过 20分钟并且我的线程结束,没有例外。
Linq2Sql DataContext中是否存在与此用例匹配的超时设置,之后我的结果变得不可用并且foreach循环结束了?
更新1(代码):
List<String> list = dc.ListaIDs().ToList<String>();
int count = 0;
foreach (var item in list)
{
string FileName = "report_" + (++count).ToString() + ".pdf";
LoggerUtility.Instance.log.Debug(String.Format("export => " + FileName));
try
{
switch (ReportFormat)
{
case "PDF":
risultato = ReportServiceImpl.WSReport("PDF", item);
System.IO.File.WriteAllBytes(FileName, risultato.PDFResult);
break;
default:
LoggerUtility.Instance.log.Warn("no format");
break;
}
}
catch (Exception ex)
{
LoggerUtility.Instance.log.Warn("error exporting => " + FileName, ex);
}
}
更新2:
rs对象(我用来分隔报表WS调用的自定义ReportService类)与该线程的范围不同;它在作为线程启动的方法之外声明和实例化,包含方法和rs声明的类是MVC 3控制器。
在ReportService类中,每次调用都会实例化一个新的ReportExecutionService(之前通过对ReportExecution2005.asmx的Web引用获得)。
更新3(WS调用代码和代码的第一部分中的一点点更新):
我重构了代码,以便对我的ReportServiceImpl
方法进行静态调用,并应用@ JamieSee的响应中告知的内容,这可能会排除Linq2Sql中的超时。
这是ReportServiceImpl.WSReport实际实现; 20分钟后,它在result = service.Render(...)
public static ReportResult WSReport(String format, string id)
{
ReportResult _return = new ReportResult();
ReportExecution.ReportExecutionService service = null;
try
{
byte[] result;
service = new ReportExecution.ReportExecutionService();
String reportPath = @"/myReport";
string historyID = null;
service.UseDefaultCredentials = true;
//load report
ExecutionInfo execInfo = new ExecutionInfo();
ExecutionHeader execHeader = new ExecutionHeader();
service.ExecutionHeaderValue = execHeader;
execInfo = service.LoadReport(reportPath, historyID);
//set execution parameter
ParameterValue[] parameters = new ParameterValue[1];
parameters[0] = new ParameterValue() { Name = "id", Value = id };
service.SetExecutionParameters(parameters, "it-IT");
String SessionId = service.ExecutionHeaderValue.ExecutionID;
//render report actually
String deviceInfo = "";
String extension;
String mimetype;
String encoding;
GestioneVIP_Services.ReportExecution.Warning[] warnings;
string[] streams;
result = service.Render(format, deviceInfo, out extension, out mimetype, out encoding, out warnings, out streams);
switch (format)
{
case Constants.EXCEL_FORMAT:
_return.XLSResult = result;
break;
case Constants.PDF_FORMAT:
_return.PDFResult = result;
break;
case Constants.HTML_FORMAT:
_return.HTMLResult = result;
break;
}
}
catch (SoapException ex)
{
LoggerUtility.Instance.log.Error(String.Format("{0}/n{1}", ex.Message, ex.StackTrace));
}
catch (Exception ex)
{
LoggerUtility.Instance.log.Error(String.Format("{0}/n{1}", ex.Message, ex.StackTrace));
}
finally
{
if (service != null)
{
service.Dispose();
}
}
return _return;
}
答案 0 :(得分:1)
尝试更改IEnumerable list = dc.ListaIDs(); to list list = dc.ListaIDs()。ToList();.这应该避免foreach中的延迟执行,并告诉你它是否是Linq问题或其他什么。
答案 1 :(得分:0)
使用上面评论中提到的多线程配置进行测试并深入研究此问题,我找到了正确的答案,因此我在此报告其完整性。
这种微妙超时的原因在于高级设置部分的过程模型部分中的空闲超时配置应用程序池。
默认值为 20分钟。
由于某些我还不明白的原因,从Web层启动的启动某些线程的进程,如果没有Web层活动被视为空闲然后停止。即使在任务管理器的进程选项卡中 w3wp.exe 进程的行为也可以看到。
在ThreadPool中排队或由此进程直接启动的任何线程都将以该进程结束。
最后我可以说它不是与Linq2Sql相关而不是与SRSS Web服务相关,而是更多与IIS流程模型相关。