【发布时间】:2014-01-21 07:28:11
【问题描述】:
我有一个在 VS2012 中开发的 WCF 客户端应用程序。我使用 MS Report Viewer 2012 (Microsoft.ReportViewer.WinForms 11.0.3366.16) 在我的应用程序中执行和显示报告。问题是当这个报告在任何 32 位环境中执行时,我得到这个异常。有趣的是,它不会在不同的 32 位机器上同时发生。
在某些机器上,它发生在数据显示在 报告。关于跟踪 64 位和 32 位机器之间的内存使用情况 我注意到在 64 位机器上,内存使用量飙升至 大约 1.3GB(应用程序的私有字节)。在 32 位 机器,它飙升到大约 650MB 的 RAM,然后给 例外。在 32 位机器上仍然有很多物理和 发生这种情况时会留下虚拟内存,这让我感到困惑。 如果您也继续,错误会不断弹出。
在其他计算机上,当您将报告导出到 Excel 时会发生这种情况 报告无事呈现后。错误有点 不同但在您关闭异常时会间歇性变化,并且 其中一个错误是“存储空间不足”错误。
当您从浏览器运行此报告时,它可以正常工作而无需 问题。
周五我测试报告时,它在 2 32bit 上运行良好 机器没有问题,我以为问题解决了,但是 星期一来了,错误又回来了。我要求伙计们重新开始 有机器确保没有不必要的东西 加载到内存中,但没有运气。
我在互联网上发现了很多关于该错误的问题,但没有一个解决方案证明有效。有没有人可以给我一些关于寻找什么的见解,因为我不知道在哪里可以找到答案了。
报表数据集有大约 300,000 行,在报表中聚合到显示的大约 3,000 行。
如果需要更多详细信息,请询问。我需要解决这个问题。
编辑
这是我设置报告的一些代码。
void BaseReportingForm_Load(object sender, System.EventArgs e)
{
rptViewer.ServerReport.ReportPath = "/test/TestReport";
rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost:80/ReportServer");
rptViewer.ServerReport.ReportServerCredentials.NetworkCredentials = new System.Net.NetworkCredential(
"Developer", "Password", "Domain");
rptViewer.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Remote;
rptViewer.ShowParameterPrompts = false;
this.RefreshReport();
//cant do this here as the parameters that are dynamically loaded will not be populated
LoadParameters(null);
}
void RefreshReport()
{
this.RefreshReport(null);
}
void RefreshReport(Microsoft.Reporting.WinForms.ReportParameterInfoCollection pParameters)
{
//run in seperate thread...
object[] argArr = new object[] { pParameters };
if (reportBackgroundWorker.IsBusy)
{
restartWorker = true;
reportBackgroundWorker.CancelAsync();
}
else
{
reportBackgroundWorker.RunWorkerAsync(argArr);
}
}
void LoadParameters(Microsoft.Reporting.WinForms.ReportParameterInfoCollection pParameters)
{
this.catchClick = false;
if (pParameters != null) //only load the parameter collection
{
Microsoft.Reporting.WinForms.ReportParameterInfoCollection rptParameters = rptViewer.ServerReport.GetParameters();
foreach (Microsoft.Reporting.WinForms.ReportParameterInfo rptParam in rptParameters)
{
if (rptParam.Prompt != "")
{
//Code removed. Just creating edits and combo's for parameters to be captured
}
}
}
else //reload whole group
{
//First delete the group if it exists
//Get parameters and add it to the group as items
string version = rptViewer.ServerReport.GetServerVersion();
Microsoft.Reporting.WinForms.ReportParameterInfoCollection rptParameters = rptViewer.ServerReport.GetParameters();
int paramPosition = 0;
foreach (Microsoft.Reporting.WinForms.ReportParameterInfo rptParam in rptParameters)
{
if (rptParam.Prompt != "")
{
//Code removed. Just creating edits and combo's for parameters to be captured
}
}
}
}
public void RunReport()
{
this.RefreshReport();
}
private void reportBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
rptViewer.Invoke(new MethodInvoker(delegate()
{
//Removed the code that populates the parameters from the created edits and combo's and put some hardcoded params in here
var vParameters = new List<Microsoft.Reporting.WinForms.ReportParameter>();
vParameters.Add(new Microsoft.Reporting.WinForms.ReportParameter("Param1", "Param1"));
rptViewer.ServerReport.SetParameters(vParameters);
rptViewer.RefreshReport();
}));
}
private void reportBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled && restartWorker)
{
restartWorker = false;
this.RefreshReport();
}
if (e.Error != null)
{
throw e.Error;
}
else
{
}
}
编辑 2
根据我的研究,我找到了这个链接: http://unixwiz.net/techtips/not-enough-codes.html 似乎系统显式地耗尽了内存或句柄。追捕 MS 并希望他们回到男人身边是最好的行动理由吗?
谢谢
【问题讨论】:
标签: c# reporting-services reportviewer