【问题标题】:AxAcroPDF control windows form hangs when closing the formAxAcroPDF 控制窗体在关闭窗体时挂起
【发布时间】:2016-12-07 16:09:12
【问题描述】:

我正在处理一个用 C# 编写的 Windows 窗体 .NET 应用程序,它需要显示具有所有相关功能(旋转对象、更改灯光等)的 3D pdf。我正在使用 AxAcroPDF COM 控件,它运行平稳。问题是,当我尝试关闭放置控件的表单时,有时它会在处理控件时挂起几秒钟而没有明显的原因。我在测试期间加载的 3D 文件不是特别重。独立 adobe 阅读器中的相同文件打开和关闭没有特别的延迟。 我在 windows 窗体关闭事件中使用以下代码:

        private void DrawingForm_FormClosing(object sender, FormClosingEventArgs e)
        {
        this.axAcroPDF.Dispose();
        Application.DoEvents();
        CoFreeUnusedLibraries(); }

        [System.Runtime.InteropServices.DllImport("ole32.dll")]
        static extern void CoFreeUnusedLibraries();

有趣的是,如果文件刚刚显示,窗体会正常关闭,但是,当旋转 3D 文件中的对象时,它会在关闭过程中挂起。当它挂起时,会显示手表的图标(与独立 Adob​​e PDF 中显示的相同)。悬挂时间在15-20秒之间。 我试图在 webbrowser 控件中显示该文件,但得到了类似的结果。这个问题的原因是什么? 我试图寻找其他稳定的控件,但没有找到任何支持 3D 的控件。

【问题讨论】:

    标签: c# winforms pdf 3d controls


    【解决方案1】:

    FormClosing 事件处理程序中添加 2 行:

    this.Controls.Remove(yourAxAcroPDFControl);

    yourAxAcroPDFControl = null; 在 Adob​​e 进行更新之前,请将其视为临时解决方案。尽管是 Adob​​e 自己编写的,但我检查了 Adob​​e SDK 示例,这些示例也导致了问题,因此我们可以预期他们会认为这是一个问题。

    【讨论】:

      【解决方案2】:

      这就是我修复它的方法 - 不是很好,但它有效!

      protected override void WndProc(ref System.Windows.Forms.Message m)
      {
        // WM_CLOSE = 16
        if (16 == m.Msg)
        {
            //closing
            axAcroPDF1.LoadFile("UNLOAD_FILE_FOR_FUDGE");
      
      
                 // we need to wait a bit
                  System.Threading.Thread.Sleep(500);
              }
      
              base.WndProc(ref m);
      
       }
      

      【讨论】:

        【解决方案3】:

        解决问题的方法不是调用 Dispose(),而是让操作系统来处理这个问题。我试过了,效果很好。为什么?也许 .NET 调用跨越 COM 边界会导致操作变慢?

        【讨论】:

          猜你喜欢
          • 2011-08-30
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 2015-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多