通过 .NET 控制台应用程序,我尝试将相同的 SSRS 报告从 SQL Server 报表服务器呈现为 PDF 数百次,但使用不同的参数。每个报告的大小约为 1 MB。
使用基本的异步方法同时生成报告:
var listOfTasks = customers
.Select(async customer =>
{
var parameters = new Dictionary<string, string>
{
{ "CustomerId", customer.Id },
{ "BillDate", billDate }
};
await GenerateInvoice(parameters);
})
.ToList();
await Task.WhenAll(listOfTasks);
private async Task GenerateInvoice(Dictionary<string, string> parameters)
{
var reportBytes = await _renderSsrs.ConvertToAsync(
"\reportPath\InvoiceReport",
parameters,
FormatType.PDF);
var filePath = $@"C:\temp\Invoices\Invoice-{parameters["CustomerId"]}.pdf";
await CreateFileFromBytesAsync(reportBytes, filePath);
}
ConvertToAsync
的实现细节可以在这里找到:问题
最初 50 份左右的报告生成速度相当快,但很快就开始变慢,直到慢慢完全停止并停止生成更多 pdf。在 SQL Server 端,它显示有打开的连接,但正在休眠并等待命令。
我相信该错误来自 SOAP WCF 客户端超时,与浏览器缓存无关,因为我没有尝试通过 Web 浏览器打开报告。
目前看来数据库/报表服务器是瓶颈,但这只是一个假设。
sp_who2
中没有列出任何阻塞进程,它只是坐在那里等待某些东西的连接。分析器似乎大部分趋于平稳,CPU 活动下降:我尝试将 rsreportserver.config“MaxActiveReqForOneUser”设置从 20 提高到 50,但没有任何改善。
有人对应用程序为何停止运行有任何建议或想法吗?如果需要,我可以发布完整的代码,但我试图让这篇文章的开头简洁。
问题是否是您一次向服务器发出太多请求,导致资源耗尽?
是的。限制并发请求。在我的测试中,20 效果很好。使用 Parallel.ForEach 之类的东西是限制并发的简单模式,例如
var po = new ParallelOptions { MaxDegreeOfParallelism = 20 };
Parallel.ForEach(paramterValues, po, x =>
{