使用RDLC在多线程中生成pdf文件时发生错误

时间:2014-07-31 08:07:48

标签: c# .net multithreading pdf rdlc

当我使用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分钟后,会出现很多异常,例如

  1. System.ComponentModel.Win32Exception(0x80004005):创建窗口句柄时出错。

  2. Microsoft.Reporting.WinForms.LocalProcessingException:本地报告处理期间发生错误。 ---&GT; Microsoft.Reporting.DefinitionInvalidException:报告“C:/1.rdlc”的定义无效。

  3. System.ServiceModel.CommunicationException:底层连接已关闭:服务器已关闭预期保持活动状态的连接。 ---&GT; System.Net.WebException:底层连接已关闭:服务器已关闭预期保持活动状态的连接。 ---&GT; System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。 ---&GT; System.Net.Sockets.SocketException:远程主机强行关闭现有连接

  4. 最糟糕的是,此WF服务的WSWP.exe将崩溃并由IIS重新创建。

    似乎某些资源未按时发布。 有人能告诉我它有什么问题吗?

0 个答案:

没有答案