2016-12-07 81 views
1

私はC#で書かれたWindowsフォーム.NETアプリケーションを扱っています。関連するすべての機能(オブジェクトの回転、ライトの変更など)を含む3D pdfを表示する必要があります。私はAxAcroPDF COMコントロールを使用しており、スムーズに動作します。問題は、コントロールが配置されているフォームを閉じようとすると、制御を破棄している間に何らかの理由で数秒間ハングすることがあることです。テスト中にロードした3Dファイルは、特に重いものではありません。スタンドアローンのAdobe Readerの同じファイルは、特別な遅延なしに開閉できます。 私は窓内の以下のコードを使用していますが、クローズイベントを形成:AxAcroPDFコントロールウィンドウのフォームは、フォームを閉じるとハングします

 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ファイル内のオブジェクトを回転させると、表示されますが、されている場合、フォームが正常に閉じていることですそれは閉鎖中にハングアップします。ハングアップすると、時計のアイコン(スタンドアローンのAdobe PDFで表示されているアイコン)が表示されます。ぶら下げ時間は15-20秒です。 webbrowserコントロール内にファイルを表示しようとしましたが、同様の結果が得られました。この問題の原因は何か? 代替の安定したコントロールを検索しようとしましたが、3Dサポートで見つけられませんでした。

答えて

1

FormClosingイベントハンドラでは2行を追加します。アドビシステムズ社が更新を持つまで

this.Controls.Remove(yourAxAcroPDFControl);

yourAxAcroPDFControl = null; が一時的な解決策を検討してください。私はAdobe SDKのサンプルをチェックしましたが、それはAdobe自身が書いているにもかかわらず問題を引き起こします。

-1

Dispose()を呼び出すのではなく、オペレーティングシステムに代わってこの問題を解決させることです。私は試して、それは完全に動作します。どうして? NETの呼び出しがCOMの境界を越えて操作が遅くなる可能性がありますか?

1

これは私がそれを修正した方法です。偉大ではありませんが、うまくいきます!

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); 

}