2016-12-07 3 views
1

Я имею дело с окнами форм .NET-приложений, написанных на C#, которые должны отображать 3D-pdf со всеми связанными функциями (вращать объект, менять свет и т. Д.). Я использую элемент управления AxAcroPDF COM, и он работает плавно. Проблема в том, что когда я пытаюсь закрыть форму, где размещается элемент управления, иногда он висит в течение нескольких секунд без видимой причины при утилизации элемента управления. 3D-файл, загруженный во время тестов, не очень тяжелый. Тот же самый файл в автономном читателе adobe открывается и закрывается без особой задержки. Я использую следующий код в пределах окон образуют закрытие события:Форма окна управления 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 не имеет обновления. Я проверил образцы 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); 

} 
Смежные вопросы