当我使用RDLC在多线程的WF服务中生成pdf文件时遇到了一个问题:
我有一个高并发运行的WF服务,在其中一个活动中我需要用RDLC制作一些pdf文件,ReportViewer dll和RDLC文件都是10.0。为了获得更高的性能,我们使用多线程,生成pdf文件的代码如下所示:
public class ReplicaMaker
{
public void MakeReplica(object emailInfo)
{
EmailInfo email = emailInfo as EmailInfo;
using (LocalReport rpt = new LocalReport())
{
rpt.ReportPath = "c:\ReplicaTempalte.rdlc";
rpt.EnableExternalImages = true;
List<ReportParameter> rptParams = new List<ReportParameter>();
{
ReportParameter param = new ReportParameter("From", email.From);
rptParams.Add(param);
}
...
{
var rptFilePath = new Uri(tempChartFileName);
ReportParameter param = new ReportParameter("ChartFilePath", rptFilePath.AbsoluteUri);
rptParams.Add(param);
report.SetParameters(rptParams);
}
while (!report.IsReadyForRendering)
{//Wait until the report is ready to render
System.Threading.Thread.Sleep(1000);
}
bytes = report.Render("pdf");
fileSize = bytes.LongLength;
//Save pdf file
using (FileStream fs = new FileStream(tempFileName, FileMode.OpenOrCreate, FileAccess.Write))
{
fs.Write(bytes, 0, bytes.Length);
fs.Flush(true);
fs.Close();
fs.Dispose();
}
}
}
}
每个线程都将创建一个ReplicaMaker的独立实例。
问题是在WF服务运行大约30分钟后,会出现很多异常,例如
System.ComponentModel.Win32Exception(0x80004005):创建窗口句柄时出错。
Microsoft.Reporting.WinForms.LocalProcessingException:本地报告处理期间发生错误。 ---&GT; Microsoft.Reporting.DefinitionInvalidException:报告“C:/1.rdlc”的定义无效。
System.ServiceModel.CommunicationException:底层连接已关闭:服务器已关闭预期保持活动状态的连接。 ---&GT; System.Net.WebException:底层连接已关闭:服务器已关闭预期保持活动状态的连接。 ---&GT; System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。 ---&GT; System.Net.Sockets.SocketException:远程主机强行关闭现有连接
最糟糕的是,此WF服务的WSWP.exe将崩溃并由IIS重新创建。
似乎某些资源未按时发布。 有人能告诉我它有什么问题吗?