前言:
近期需做FastRereport多线程导出支持,首先按照一般的处理方式写了Demo,测试后一直提示:
**遇到错误 执行 CreateHandle() 时无法调用值 Dispose()**
-
按照网上查到的方案,试图在线程内加入控制FastReport 关闭时机,调试后发现是FastReport本身报错导致。
-
使用AutoResetEvent、Lock 控制多个线程同时执行时
同一个时间内只允许一个FastReport对象在运行,因锁定了单个时间内的执行对象,体现不了多线程效率优势。 -
使用线程指定 单元状态
ApartmentState.STA,报错不允许跨线程操作,后加入跨线程委托代码,直接提示与点1一样的FastReport报错。 -
经过上述3点的测试过程后,查询官网,未解决报错
4.1:代码片段是vcl版本 FastReport 的解决方案( https://www.fastreportcn.com/post/1030.html),调用.net版本中不存在 对应属性设置。
4.2:参考delphi 版本代码(https://www.cnblogs.com/yangxuming/p/7153920.html)
经过上述4点的调试调试过程,想了下应该不至于如此啊!想着再查下有没有其他类似的解决方案,后意外看到一段设置FastReport 打印过程中的弹窗代码设置。
FastReport.EnvironmentSettings eSet = new EnvironmentSettings();
eSet.ReportSettings.ShowProgress = false;
多线程过程中,每个线程都会弹出提示框 正在打印,是否这里的提示框有阻塞到线程?测试了下 在每个FastReport对象 实例化后直接关闭提示框是否有用?随后测试下,奇迹的解决了FastReport报错问题!现将代码整理 做个记录。private void Form1_Load(object sender, EventArgs e) { string AexportFolder = AppDomain.CurrentDomain.BaseDirectory; AexportFolder = Path.Combine(AexportFolder, "Test"); if (!Directory.Exists(AexportFolder)) { Directory.CreateDirectory(AexportFolder); } FileInfo[] f = new DirectoryInfo(AexportFolder).GetFiles(); for (int i = 0; i < f.Length; i++) { File.Delete(f[i].FullName); } //frx temp string frxTemp = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "frmTemp"); if (!Directory.Exists(frxTemp)) { Directory.CreateDirectory(frxTemp); } f = new DirectoryInfo(frxTemp).GetFiles(); for (int i = 0; i < f.Length; i++) { File.Delete(f[i].FullName); } for (int i = 0; i < 100; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback((_) => { Print(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Test")); })); } Process.Start(AexportFolder); } private void Print(string AexportFolder) { try { using (Report fastReprot = new Report()) { //提示框 隐藏.关键点:这里的进度提示条 在多线程中必须关闭,否则有阻塞问题 FastReport.EnvironmentSettings eSet = new EnvironmentSettings(); eSet.ReportSettings.ShowProgress = false; //拷贝一下或者 也可以直接使用,看使用场景是否 外部环境是否存在 对文件删除或者创建的过程 string source = @"D:\TestProject\FastReort多线程\FastReort多线程\bin\Debug\000.frx"; string pritnTempFilePath = source; // pritnTempFilePath = Path.Combine(@"D:\TestProject\FastReort多线程\FastReort多线程\bin\Debug\frmTemp", Guid.NewGuid().ToString()) + ".frx"; //File.Copy(source, pritnTempFilePath); fastReprot.Load(pritnTempFilePath); AexportFolder = Path.Combine(AexportFolder, Guid.NewGuid().ToString() + ".JPG"); string fileName = AexportFolder; fastReprot.Prepare(); //准备 FastReport.Export.Image.ImageExport exportbase = new FastReport.Export.Image.ImageExport(); //导出图像 exportbase.Resolution = 200; fastReprot.Export(exportbase, fileName); } } catch (Exception e) { } }