FastReport .net多线程注意点

前言:

近期需做FastRereport多线程导出支持,首先按照一般的处理方式写了Demo,测试后一直提示:

 **遇到错误 执行 CreateHandle() 时无法调用值 Dispose()**
  1. 按照网上查到的方案,试图在线程内加入控制FastReport 关闭时机,调试后发现是FastReport本身报错导致。

  2. 使用AutoResetEvent、Lock 控制多个线程同时执行时
    同一个时间内只允许一个FastReport对象在运行,因锁定了单个时间内的执行对象,体现不了多线程效率优势。

  3. 使用线程指定 单元状态
    ApartmentState.STA,报错不允许跨线程操作,后加入跨线程委托代码,直接提示与点1一样的FastReport报错。

  4. 经过上述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)
        {
    
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值